【发布时间】:2011-11-17 22:15:18
【问题描述】:
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。有没有一些合理的方法(标准,因为我希望它是可移植的)来做到这一点?
【问题讨论】:
-
你需要它作为整数做什么?保证对其进行任何类型的算术运算都没有意义,并且在进程的上下文之外没有意义,因此除了调试之外不需要序列化它(
operator<<似乎处理得很好)。 -
类似这样的东西:1024cores.net/home/lock-free-algorithms/false-sharing---false 但不是 N=MAX_THREAD_COUNT 我会有类似 N=128 的东西并执行 thread_id%N
-
如果您真的希望它是可移植的,那么您需要为
thread::id根本不表示为整数的可能性做好准备。您链接到的页面使用一个数组,由线程 ID 索引。您是否考虑过改用map<thread::id, int>?然后,您可以使用已经为id类定义的关系运算符,而无需进行任何转换。该标准还定义了hash<thread::id>,因此您也可以使用无序容器。 -
@Rob 该地图需要互斥锁 :(
-
@SwissFrank 或者我应该说 CHF :PI 还在,但我认为接受的答案对我来说没问题,我有责任确保变量 id 值在一个程序。
标签: c++ multithreading c++11