繁体   English   中英

如何获取顺序线程 ID

[英]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_ttid_t到特定范围内的数字。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM