c++ को बढ़ावा धागा करने के लिए एक नाम दें?




debugging boost-thread (2)

मैं Win32 + VS2010 को बढ़ावा देने 1.50.0 का उपयोग कर रहा हूं और thread::native_handle में वह संख्या शामिल है, जिसे मैंने सिस्टम में किसी भी चीज़ से जोड़ा नहीं था। दूसरी ओर, thread::get_id() विधि एक हेक्साडेसिमल स्ट्रिंग के रूप में सीधे विंडोज़ थ्रेड आईडी रिटर्न करता है। ध्यान दें कि वापस दिया जाने वाला मान प्लेटफ़ॉर्म विशिष्ट है, यद्यपि। निम्न कोड बूस्ट 1.50.0 + Win32 + VS2010 के तहत काम करता है। एमएसडीएन से पुन: उपयोग किए गए कोड के कुछ भाग

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");

क्या boost::thread लिए कोई नाम देना संभव है 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





boost-thread