Дать название буст-теме? - PullRequest
17 голосов
/ 27 июля 2010

Можно ли дать имя boost::thread, чтобы таблицы отладчиков и журналы сбоев были более читабельными?Как?

Ответы [ 2 ]

6 голосов
/ 27 июля 2010

Вам потребуется получить доступ к базовому потоку примитива и назначить имя системно-зависимым способом. Журналы отладки и сбоев по своей природе зависят от системы, а boost :: thread больше относится к несистемной зависимости, то есть к переносимости.

Кажется (http://www.boost.org/doc/libs/1_43_0/doc/html/thread.html), что не существует документированного способа доступа к базовым системным ресурсам для потока поддержки. (Но я никогда не использовал его сам, поэтому могу что-то пропустить.)

Редактировать: (Как пишет Дэвид в комментарии) http://www.boost.org/doc/libs/1_43_0/doc/html/thread/thread_management.html#thread.thread_management.thread.nativehandle

4 голосов
/ 16 июля 2012

Я использую boost 1.50.0 на Win32 + VS2010, а thread::native_handle содержит номер, который мне не удалось связать с чем-либо в системе.С другой стороны, метод thread::get_id() возвращает непосредственно идентификатор потока Windows в форме шестнадцатеричной строки.Обратите внимание, что возвращаемое значение зависит от платформы.Следующий код работает под Boost 1.50.0 + Win32 + VS2010.Части кода, повторно используемые из msdn

const DWORD MS_VC_EXCEPTION = 0x406D1388;
#pragma pack(push, 8)
typedef struct THREADNAME_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(DWORD threadId, const char* threadName) {
    THREADNAME_INFO info;
    info.dwType = 0x1000;
    info.szName = threadName;
    info.dwThreadID = threadId;
    info.dwFlags = 0;
    __try {
        RaiseException( MS_VC_EXCEPTION, 0, sizeof(info)/sizeof(ULONG_PTR), (ULONG_PTR*)&info );
    }
    __except(EXCEPTION_EXECUTE_HANDLER) {
    }
}
void SetThreadName(boost::thread::id threadId, std::string threadName) {
    // convert string to char*
    const char* cchar = threadName.c_str();
    // convert HEX string to DWORD
    unsigned int dwThreadId;
    std::stringstream ss;
    ss << std::hex << threadId;
    ss >> dwThreadId;
    // set thread name
    _SetThreadName((DWORD)dwThreadId, cchar);
}

Звоните так:

boost::thread* thr = new boost::thread(boost::bind(...));
SetThreadName(thr->get_id(), "MyName");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...