std::thread - 命名你的线程

新手上路,请多包涵

新的 C++ 有这个 std::thread 类型。奇迹般有效。现在我想给每个线程一个名称以便于调试(就像 java 允许的那样)。使用 pthreads 我会这样做:

 pthread_setname_np(pthread_self(), "thread_name");

但是我怎么能用 c++0x 做到这一点?我知道它在 Linux 系统下使用 pthreads,但我想让我的应用程序可移植。有可能吗?

原文由 Folkert van Heusden 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.7k
2 个回答

一种可移植的方法是维护一个名称映射,由线程 ID 键入,从 thread::get_id() 获得。或者,如评论中所建议的,如果您只需要从线程内访问名称,您可以使用 thread_local 变量。

如果您不需要可移植性,那么您可以从 --- 获取底层的 pthread_t thread::native_handle() 并使用它做任何特定于平台的恶作剧。请注意,线程命名函数上的 _np 表示“非 posix”,因此不能保证它们在所有 pthreads 实现中都可用。

原文由 Mike Seymour 发布,翻译遵循 CC BY-SA 3.0 许可协议

尝试制作一个包装器来处理许多 Linux 和 Windows。请根据需要进行编辑。

 #ifdef _WIN32
#include <windows.h>
const DWORD MS_VC_EXCEPTION=0x406D1388;

#pragma pack(push,8)
typedef struct tagTHREADNAME_INFO
{
   DWORD dwType; // Must be 0x1000.
   LPCSTR szName; // Pointer to name (in user addr space).
   DWORD dwThreadID; // Thread ID (-1=caller thread).
   DWORD dwFlags; // Reserved for future use, must be zero.
} THREADNAME_INFO;
#pragma pack(pop)

void SetThreadName(uint32_t dwThreadID, const char* threadName)
{

  // DWORD dwThreadID = ::GetThreadId( static_cast<HANDLE>( t.native_handle() ) );

   THREADNAME_INFO info;
   info.dwType = 0x1000;
   info.szName = threadName;
   info.dwThreadID = dwThreadID;
   info.dwFlags = 0;

   __try
   {
      RaiseException( MS_VC_EXCEPTION, 0, sizeof(info)/sizeof(ULONG_PTR), (ULONG_PTR*)&info );
   }
   __except(EXCEPTION_EXECUTE_HANDLER)
   {
   }
}
void SetThreadName( const char* threadName)
{
    SetThreadName(GetCurrentThreadId(),threadName);
}

void SetThreadName( std::thread* thread, const char* threadName)
{
    DWORD threadId = ::GetThreadId( static_cast<HANDLE>( thread->native_handle() ) );
    SetThreadName(threadId,threadName);
}

#elif defined(__linux__)
#include <sys/prctl.h>
void SetThreadName( const char* threadName)
{
  prctl(PR_SET_NAME,threadName,0,0,0);
}

#else
void SetThreadName(std::thread* thread, const char* threadName)
{
   auto handle = thread->native_handle();
   pthread_setname_np(handle,threadName);
}
#endif

原文由 Mark Lakata 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题