跨平台(linux/win)启动线程, 并设置线程名称(便于调试)
来源:互联网 发布:秀萝捏脸数据 编辑:程序博客网 时间:2024/06/06 05:54
#ifndef THREAD_H#define THREAD_H#include <string>#include <iostream>#ifdef WIN32#else#include <pthread.h>#endifusing namespace std;class CThread{public: CThread(const string &strThreadName = ""); virtual ~CThread(); virtual unsigned ThreadProc() = 0; const string& GetThreadName(); void SetThreadName(const string &strThreadName); void WaitThisThread();#ifdef WIN32 static unsigned __stdcall s_ThreadProc(void* self); HANDLE StartThread();private: void SetNameInternal(DWORD dwThreadID, const char* cThreadName);public: HANDLE m_handle;#else static void * s_ThreadProc(void* self); pthread_t StartThread();public: pthread_t m_id;#endifprivate: string m_strThreadName;};#endif // THREAD_H#include "stdafx.h" // win文件包含在预编译头文件里#include "thread.h"#ifdef WIN32#else#include <sys/prctl.h>#endifCThread::CThread(const string &strThreadName):m_strThreadName(strThreadName),#ifdef WIN32 m_handle(0)#else m_id(0)#endif{}CThread::~CThread(){}const string& CThread::GetThreadName(){ return m_strThreadName;}void CThread::SetThreadName(const string &strThreadName){ m_strThreadName = strThreadName;}#ifdef WIN32 // win实现方式const DWORD MS_VC_EXCEPTION = 0x406D1388;// https://msdn.microsoft.com/zh-cn/library/xcb2z8hs.aspx#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 CThread::SetNameInternal(DWORD dwThreadID, const char* cThreadName){ THREADNAME_INFO info; info.dwType = 0x1000; info.szName = cThreadName; info.dwThreadID = dwThreadID; info.dwFlags = 0; __try { RaiseException( MS_VC_EXCEPTION, 0, sizeof(info)/sizeof(ULONG_PTR), (ULONG_PTR*)&info ); } __except(EXCEPTION_EXECUTE_HANDLER) { }}unsigned __stdcall CThread::s_ThreadProc(void* self){ // self obj CThread *_self = (CThread*)self; // run proc return _self->ThreadProc();}HANDLE CThread::StartThread(){ // 线程id DWORD nThreadId; // 启动线程 m_handle = (HANDLE)_beginthreadex(NULL, 0, s_ThreadProc, (CThread *)this, 0, (unsigned int*)&nThreadId); // 设置线程名 SetNameInternal(nThreadId, m_strThreadName.c_str()); return m_handle;}void CThread::WaitThisThread(){ ::WaitForSingleObject( m_handle, INFINITE );}#else // linux实现方式void * __stdcall CThread::s_ThreadProc(void* self){ // self obj CThread *_self = (CThread*)self; // set thread name prctl(PR_SET_NAME, _self->m_strThreadName.c_str()); // run proc _self->ThreadProc(); return NULL;}pthread_t CThread::StartThread(){ pthread_create(&m_id, NULL, s_ThreadProc, this); return m_id;}void CThread::WaitThisThread(){ pthread_join(m_id,NULL);}#endif
0 0
- 跨平台(linux/win)启动线程, 并设置线程名称(便于调试)
- 调试显示线程名称
- 设置线程名称函数
- 设置线程名称 - SetThreadName
- 一个用于列举所有线程的JSP页面,便于调试
- 如何设置线程的名称
- netty NioEventLoopGroup 线程名称设置
- linux 设置进程/线程显示名称 杀僵尸进程
- 定义并启动线程
- Linux 线程调试
- linux 线程调试
- 创建并启动 Java 线程
- 线程名称的获取与设置
- windows多线程,debug时设置线程名称
- windows多线程,debug时设置线程名称
- 多线程-获取和设置线程对象名称
- Linux 线程设置属性
- Linux:设置“线程”优先级
- POJ 2773 Happy 2006 (容斥)
- 应用迭代更新流程和工具分享
- Deep Learning(深度学习)学习笔记整理系列之(八)
- window下配置 maven私服
- 链表检测环以及环的入口
- 跨平台(linux/win)启动线程, 并设置线程名称(便于调试)
- C++习题记录-牛客网
- TDD和BDD及DDD的解说
- Swift下拉菜单动画实现
- 闭包-简洁版(Swift)
- 打包Tomcat中的web程序的指令
- Extjs/Ajax中的success和failure 何时调用?
- html5从入门到精通-新增属性
- Apple Watch UI设计基础