c++11有可能获得当前线程id,但它不能强制转换为整数类型:
cout<<std::this_thread::get_id()<<endl;
输出: 139918771783456
cout<<(uint64_t)std::this_thread::get_id()<<endl;
错误:类型‘std::thread::id’到类型‘uint64_t’的无效强制转换与其他类型相同:类型‘std::thread::id’到类型‘uint32_t’的无效强制转换
我真的不想做指针转换来获得整数线程id。有没有什么合理的方法(标准是因为我希望它是可移植的)来做到这一点?
发布于 2011-09-15 22:33:14
可移植的解决方案是将您自己生成的is传递到线程中。
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。
发布于 2014-05-28 16:43:47
另一个id (idea?^^)是使用stringstreams:
std::stringstream ss;
ss << std::this_thread::get_id();
uint64_t id = std::stoull(ss.str());
如果你不想在出错的情况下出现异常,请使用try catch…
发布于 2011-12-09 06:40:36
一个想法是使用线程本地存储来存储变量--不管它是什么类型,只要它符合线程本地存储的规则--然后使用该变量的地址作为你的“线程id”。显然,任何算术运算都是没有意义的,但它将是一个整数类型。
对于后代:pthread_self()
返回一个pid_t
,并且是posix。对于可移植的定义来说,这是可移植的。
gettid()
,几乎可以肯定它不是可移植的,但它确实返回一个GDB友好的值。
https://stackoverflow.com/questions/7432100
复制相似问题