Multithreading C++;11:是否有任何与用户相关的线程ID?

Multithreading C++;11:是否有任何与用户相关的线程ID?,multithreading,c++11,pthreads,Multithreading,C++11,Pthreads,我使用的是运行在Fedora 31版(三十一版)上的g++版本9.2.1 20190827(Red Hat 9.2.1-1)(GCC)。我正在链接-pthread 我不认为GDB打印的是线程id:s,而只是一个序列号,启动的线程越多,该序列号就会增加,因此您的替代方案听起来是可行的解决方案。您可以将活动线程存储在std::unordered_map日志库检查线程本地上下文结构是否为init'd。如果不是,则使用原子CAS递增全局日志模块上下文的线程计数器,并使用该计数器。我不知道线程本地通常是如

我使用的是运行在Fedora 31版(三十一版)上的g++版本9.2.1 20190827(Red Hat 9.2.1-1)(GCC)。我正在链接
-pthread


我不认为GDB打印的是线程id:s,而只是一个序列号,启动的线程越多,该序列号就会增加,因此您的替代方案听起来是可行的解决方案。您可以将活动线程存储在
std::unordered_map
日志库检查线程本地上下文结构是否为init'd。如果不是,则使用原子CAS递增全局日志模块上下文的线程计数器,并使用该计数器。我不知道线程本地通常是如何实现的;你认为它是在内部进行哈希表查找吗?嗯,我不知道。如果编译器足够强大,可以从一开始就计算出你有多少个thread_local,我想它可以在编译时生成某种查找表,我喜欢使用thread_local来实现这一点。它可能比映射更快,因此可以测量性能。线程具有与其关联的元数据(在Windows上是TEB),这通常由x86的fs或gs选择器指向。线程本地存储只是元数据中的一个指针。至少它在Windows或Linux上通常是这样工作的。我不想打赌什么效率更高(实际上,在任何情况下,它的开销都可以忽略不计),但是记住在读取或写入hashmap时要锁定它。我不认为GDB打印线程id:s,而是一个序列号,它会随着启动的线程数的增加而增加,因此您的替代方案听起来是可行的解决方案。您可以将活动线程存储在
std::unordered_map
日志库检查线程本地上下文结构是否为init'd。如果不是,则使用原子CAS递增全局日志模块上下文的线程计数器,并使用该计数器。我不知道线程本地通常是如何实现的;你认为它是在内部进行哈希表查找吗?嗯,我不知道。如果编译器足够强大,可以从一开始就计算出你有多少个thread_local,我想它可以在编译时生成某种查找表,我喜欢使用thread_local来实现这一点。它可能比映射更快,因此可以测量性能。线程具有与其关联的元数据(在Windows上是TEB),这通常由x86的fs或gs选择器指向。线程本地存储只是元数据中的一个指针。至少它在Windows或Linux上通常是这样工作的。我不想打赌什么效率更高(实际上,在任何情况下,它的开销都可以忽略不计),但记住在读取或写入hashmap时锁定它。