[英]How do I get sequential thread ids
我有一个 c++ linux 项目,由单独的生产者和消费者可执行文件组成。 Producer有多个线程,每个线程都有不同的共享memory区域用于进程间通信。 线程是由第三方库启动的,我不能轻易地将自定义参数传递给它们。
我的问题是我需要一种方法来设置线程以写入共享 memory 的不同区域以避免竞争和锁定。
到目前为止,我想出了以下解决方案:
static size_t get_thread_index() {
static std::mutex once;
std::lock_guard<std::mutex> guard(once);
static std::map<pid_t, size_t> id_map;
pid_t tid = syscall(SYS_gettid);
auto it = id_map.find(tid);
if (it != id_map.end()) {
return it->second;
} else {
assert(id_map.size() < SHM_QUEUE_MAX_NODES);
return (id_map[tid] = id_map.size());
}
}
然后在生产者内部
static thread_local size_t node_id = get_thread_index();
(*shm_q)[write_node_id] ...
但是对于这样一个简单的任务,这个解决方案感觉完全是矫枉过正。
我不能只使用syscall(SYS_gettid) % NUMBER_OF_THREADS
之类的东西,因为不能保证线程 ID 是连续的。
有没有一种简单的方法可以做到这一点?
有没有一种简单的方法可以做到这一点?
与其拥有一个顺序线程号的中央注册表,不如简单地拥有一个用于顺序线程号的中央生成器呢? 每个线程获取它的编号(一次),并将其存储在其控制下的某个地方。 你可以用一个简单的原子 integer 来实现它:
static std::atomic_uint next_thread_number(0);
然后每个线程都可以做...
unsigned int my_thread_number = next_thread_number++;
...因为std::atomic
的++
运算符执行原子读取-修改-写入操作。
有没有一种简单的方法可以做到这一点?
没有 API 或以某种方式生成进程/线程 ID 的要求。
您应该使用 hash 表(例如std::unordered_map
)到 map pid_t
或tid_t
到特定范围内的数字。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.