首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在c++11中获取整数线程id

如何在c++11中获取整数线程id
EN

Stack Overflow用户
提问于 2011-09-15 22:00:28
回答 10查看 110.6K关注 0票数 98

c++11有可能获得当前线程id,但它不能强制转换为整数类型:

代码语言:javascript
复制
cout<<std::this_thread::get_id()<<endl;

输出: 139918771783456

代码语言:javascript
复制
cout<<(uint64_t)std::this_thread::get_id()<<endl;

错误:类型‘std::thread::id’到类型‘uint64_t’的无效强制转换与其他类型相同:类型‘std::thread::id’到类型‘uint32_t’的无效强制转换

我真的不想做指针转换来获得整数线程id。有没有什么合理的方法(标准是因为我希望它是可移植的)来做到这一点?

EN

回答 10

Stack Overflow用户

回答已采纳

发布于 2011-09-15 22:33:14

可移植的解决方案是将您自己生成的is传递到线程中。

代码语言:javascript
复制
int id = 0;
for(auto& work_item : all_work) {
    std::async(std::launch::async, [id,&work_item]{ work_item(id); });
    ++id;
}

std::thread::id类型仅用于比较,而不用于算术(即,正如它在can上所说的:标识符)。即使是由operator<<生成的文本表示也是未指定的,因此您不能依赖它作为数字的表示。

您还可以使用std::thread::id值到您自己的id的映射,并在线程之间共享此映射(通过适当的同步),而不是直接传递id。

票数 36
EN

Stack Overflow用户

发布于 2014-05-28 16:43:47

另一个id (idea?^^)是使用stringstreams:

代码语言:javascript
复制
std::stringstream ss;
ss << std::this_thread::get_id();
uint64_t id = std::stoull(ss.str());

如果你不想在出错的情况下出现异常,请使用try catch…

票数 29
EN

Stack Overflow用户

发布于 2011-12-09 06:40:36

一个想法是使用线程本地存储来存储变量--不管它是什么类型,只要它符合线程本地存储的规则--然后使用该变量的地址作为你的“线程id”。显然,任何算术运算都是没有意义的,但它将是一个整数类型。

对于后代:pthread_self()返回一个pid_t,并且是posix。对于可移植的定义来说,这是可移植的。

gettid(),几乎可以肯定它不是可移植的,但它确实返回一个GDB友好的值。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7432100

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档