- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在使用 std::thread 来启动线程。另外,我需要 /proc/[pid]/tasks/[tid]
中提供的工作线程的统计信息。我需要 tid 才能监视线程统计信息。我想知道是否有办法从父线程中提取 tid
。我知道来自工作线程的系统调用 gettid() 返回其 id,但我想要来自主线程而不是从线程的 threadId。有没有办法从 std::thread.get_tid() 的 thread_id 或 std::thread.get_tid() 中提取 tid
?
我相信可能有更好的方法,请提出建议:)
更新:
How can you get the Linux thread Id of a std::thread()这提供了一些有关从工作线程获取 tid 的信息,增加了线程启动的开销。例如,可以从启动器线程调用 std::thread t = std::thread(&wrapper);
t.get_id()
。我正在寻找是否可以以安全的方式从主/启动器线程执行相同的操作。
最佳答案
所有线程都有一个唯一的 ID:std::thread::id this_id = std::this_thread::get_id();
您可以在程序启动时将其存储在变量中,并且可以从其他线程访问它。
我明白你所说的“父线程”的意思,但即使一个线程生了另一个线程,它们也是 sibling 。
如果您希望主线程能够获取每个工作线程的/proc
路径,您可以将工作线程对象包装在一个类中,当它启动实际线程时,创建一个主线程稍后可以获取的路径属性。
一个例子:
#include <unistd.h>
#include <sys/syscall.h>
#include <sys/types.h>
#include <condition_variable>
#include <iostream>
#include <mutex>
#include <thread>
// A base class for thread object wrappers
class abstract_thread {
public:
abstract_thread() {}
abstract_thread(const abstract_thread&) = delete;
abstract_thread(abstract_thread&& rhs) :
m_th(std::move(rhs.m_th)), m_terminated(rhs.m_terminated), m_cv{}, m_mtx{} {}
abstract_thread& operator=(const abstract_thread&) = delete;
abstract_thread& operator=(abstract_thread&& rhs) {
terminate();
join();
m_th = std::move(rhs.m_th);
m_terminated = rhs.m_terminated;
return *this;
}
virtual ~abstract_thread() {
// make sure we don't destroy a running thread object
terminate();
join();
}
virtual void start() {
if(joinable())
throw std::runtime_error("thread already running");
else {
std::unique_lock<std::mutex> lock(m_mtx);
m_terminated = true;
// start thread and wait for it to signal that setup has been done
m_th = std::thread(&abstract_thread::proxy, this);
m_cv.wait(lock, [this] { return m_terminated == false; });
}
}
inline bool joinable() const { return m_th.joinable(); }
inline void join() {
if(joinable()) {
m_th.join();
}
}
inline void terminate() { m_terminated = true; }
inline bool terminated() const { return m_terminated; }
protected:
// override if thread specific setup needs to be done before start() returns
virtual void setup_in_thread() {}
// must be overridden in derived classes
virtual void execute() = 0;
private:
std::thread m_th{};
bool m_terminated{};
std::condition_variable m_cv{};
std::mutex m_mtx{};
void proxy() {
{
std::unique_lock<std::mutex> lock(m_mtx);
setup_in_thread(); // call setup function
m_terminated = false;
m_cv.notify_one();
}
execute(); // run thread code
}
};
// an abstract thread wrapper capable of returning its /proc path
class proc_path_thread : public abstract_thread {
public:
// function to call from master to get the path
const std::string& get_proc_path() const { return m_proc_path; }
protected:
void setup_in_thread() override {
m_proc_path =
std::move(std::string("/proc/")) + std::to_string(syscall(SYS_gettid));
}
private:
std::string m_proc_path{};
};
// two different thread wrapper classes. Just inherit proc_path_thread and implement
// "execute()". Loop until terminated() is true (or you're done with the work)
class AutoStartThread : public proc_path_thread {
public:
AutoStartThread() { start(); }
private:
void execute() override {
while(!terminated()) {
std::this_thread::sleep_for(std::chrono::milliseconds(500));
std::cout << std::this_thread::get_id() << " AutoStartThread running\n";
}
}
};
class ManualStartThread : public proc_path_thread {
void execute() override {
std::this_thread::sleep_for(std::chrono::milliseconds(100));
std::cout << std::this_thread::get_id() << " ManualStartThread running\n";
std::this_thread::sleep_for(std::chrono::milliseconds(100));
}
};
int main() {
AutoStartThread a;
std::cout << a.get_proc_path() << "\t// AutoStartThread, will have path\n";
ManualStartThread b;
std::cout << b.get_proc_path()
<< "\t// ManualStartThread not started, no path\n";
b.start();
std::cout << b.get_proc_path()
<< "\t// ManualStartThread will now have a path\n";
b.join();
std::this_thread::sleep_for(std::chrono::milliseconds(1500));
// terminate() + join() is called automatically when abstract_thread descendants
// goes out of scope:
//
// a.terminate();
// a.join();
}
可能的输出:
/proc/38207 // AutoStartThread, will have path
// ManualStartThread not started, no path
/proc/38208 // ManualStartThread will now have a path
139642064209664 ManualStartThread running
139642072602368 AutoStartThread running
139642072602368 AutoStartThread running
139642072602368 AutoStartThread running
139642072602368 AutoStartThread running
关于c++ - 如何从父线程中提取pthread的taskid(tid)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56588075/
这个 MySQL 查询有其他选择吗? SELECT * FROM type WHERE tid='1' OR tid='2'; 这里的 type 是表格,tid 是表格的 ID,我想以任何方式选择前
我有这个通用类,它使用 Entity Framework 6.x。 public class GenericRepository where TEntity, class, IIdentifyable
我正在使用 glib 创建线程: g_thread_create() 如何获取线程id(编号)? 最佳答案 你不能。线程 ID 在 GLib 中被抽象出来。你需要它做什么? 关于glib - glib
我正在使用 std::thread 来启动线程。另外,我需要 /proc/[pid]/tasks/[tid] 中提供的工作线程的统计信息。我需要 tid 才能监视线程统计信息。我想知道是否有办法从父线
http://www.cs.colostate.edu/~cs370/Spring15/Workbook/thread_ex.txt 我的教授提供了上面的示例代码(没有复制以保护他的 IP),我对输出
在 Linux ps -eLf | grep my-process-name给出了我的进程中的线程列表以及每个线程的 TID。 在 OSX 上 ps -M pid给了我线程列表,但没有显示每个线程的
当 TID 响应 kill 系统调用时,有什么方法可以检测到 PID 真的死了,然后就像进程仍然存在一样。 #include #include #include #include #inclu
我创建了一个多线程模拟器,它严重依赖于线程之间传递的 native 消息(不要告诉我去单线程它是为了我关于 D 的论文,我需要让它工作) 在一次非常耐用的杂物之后,涉及到和来自 shared 的大量物
我发现在下面的代码中,每次接受新客户端时都会创建一个线程。在函数 pthread_client() 中没有退出日志。但是似乎没有通过命令 ps aux 创建多线程 我的理解是,每次创建一个具有相同ti
我一直在尝试使用 tgkill 远程终止一个线程。我知道pthread_kill 被推荐用于这种事情,因为没有任何 glibctgkill 的包装器,但是,我将在进程之外进行 kill 调用。 我在这
我正在为应用程序使用 Visualforce Remoting,并定期收到错误: Uncaught TypeError: Cannot read property 'tid' of undefined
我想在Asus_Z008D上构建我的应用程序,但是我有这个问题: [Mono] Could not load file or assembly 'System.Runtime, Version=4.0
我只是遇到了问题。当我将gradle版本更改为2.1.0(旧版本是1.5.0)时,我的代码出错了。而且它没有logcat,所以我只是不知道如何查找问题和错误的零件代码。我试图在我的AndroidMan
我调用内核函数 sched_setaffinity() 以尝试使用 CPU 锁定内核线程,但它总是失败,错误号 22 显示“参数无效”。该机器运行 Fedora 15,内核版本为 2.6.38。 如果
当我记录名为 tid 的键的 json 字符串时,它总是返回 0。请检查以下示例。 var transaction = {tid:1, type:0, time:126312736}; var tra
JVMTI 有一个函数叫做GetAllThreads。但是我们只能得到jthread对象。有什么方法可以获取 jthread 对象的 tid 吗?我所说的 tid 是指由 gettid() 系统调用返
这个问题不是关于 pthread ID,而是关于通常由 gettid 或 ptrace 获取的值。 linux 内核是否提供任何机制以相对有效的方式从给定的 tid 中获取线程组 ID(通常通过 ge
我使用以下内容来获取 drupal 8 中分类术语的父级: $parent = \Drupal::entityTypeManager()->getStorage('taxonomy_term')->l
我的应用程序崩溃,除了出现此错误外,没有任何堆栈跟踪: A/libc: Fatal signal 11 (SIGSEGV), code 128, fault addr 0x0 in tid 12680
我必须这样做: 编写一个程序,其主线程创建 3 个其他线程。这些线程(不同于主线程)中的每一个都应写入其 pid 和 tid,并终止返回 1 到 3 之间的整数,并且不同于其他线程返回的值。主线程应在
我是一名优秀的程序员,十分优秀!