C ++ Telltales第1部分:
这是我的C ++ Telltales系列的第一篇文章,我在其中分享了一些使用C ++的技巧。 请随时在 这里查看 该系列的其他部分 !
C ++提供了一种使用std :: this_thread :: get_id()方法获取当前线程ID的标准方法。 该方法返回std :: thread :: id类型,它是当前线程的唯一标识符。 可以按原样或通过std :: hash来打印出std :: thread :: id,但是输出不是那么好并且用户友好。 如果您有多线程应用程序,并且使用了某种日志功能,则以下代码片段可能会派上用场:
它的作用是将std :: thread :: id转换为单个数字,并将这些数字保留在静态映射中,以使相同的线程具有相同的数字。 如果您使用Clang ThreadSanitizer ,它将成为一个救生员,因为将以与您使用此功能所实现的ID完全相同的ID报告消毒剂发现的问题。 如果您必须解决线程问题,则只需检查日志以查找引起该线程的所有线程调用。 美丽。
ThreadSanitizer示例
正如许多人在Reddit上询问的那样,我还创建了一个示例应用程序,显示了Clang ThreadSanitizer。 这是主要功能的代码段:
如您所知,这将产生ThreadSanitizer警告,因为同时从两个线程修改了计数器:
如您所见,clang和get_thread_id函数的ID完全匹配。 这也可以用于两个以上的线程。
使用thread_local
也可以通过使用thread_local变量而不使用map或互斥体来实现相同的功能:
感谢Reddit中的@obamurri指出这一点! 使用它可以为线程提供唯一的数字作为唯一标识符,但不幸的是,它与消毒剂提供的数字不匹配。 至少如果在程序运行期间重新启动了线程。 此外,Reddit对话指出,使用此类ID不能与gdb和htop之类的工具配合使用,但是如果您使用的是消毒剂,则可能会有很大的不同。 要解决此问题,您可以记录两个ID。
这是instaco.de图像,提供该故事的封面照片:
如果您喜欢这个故事,请按下面的❤按钮(您知道可以鼓掌不止一次)。 也请随时分享这个故事!
关于我
我是Heikki Hellgren,是Elektrobit Automotive的软件专家和技术爱好者。 我的兴趣是软件构建,工具,自动测试以及AI和自动驾驶等所有新奇事物。 您可以在Medium和Twitter上关注我,并查看我的网站以获取更多信息。
From: https://hackernoon.com/c-telltales-pt-1-human-readable-thread-id-92caa554a35f