On Nov 5, 2009, at 10:19 AM, Rush Manbert wrote:
On Nov 5, 2009, at 7:02 AM, Ondrej Sluciak wrote:
Hello, is there a way how to get the thread id that system assigns to thread? I mean the id that is located in "thread_info->id". It would quite nice if boost could return this value, because for example if I want to set name of the thread on windows using function SetThreadName(), I need exactly that id. In my application I would have to add this "feature" directly to boost::thread.hpp, which is not very nice solution. I know that also GetThreadName(myThread->native_handle()) should work, but if I do it like this I always get a Windows error "The procedure entry point GetThreadId could not be located in the dynamic link library KERNEL32.dll". And I also guess, that this new "feature" wouldn't destroy the overall design of boost::thread architecture. To get the "real" thread id is in my opinion in general a useful thing.
I'm almost ashamed to post this, but maybe it helps you.
Here's a really nasty hack that I came up with to get the Thread::id_t value of the thread id:
To clarify, Thread::id_t in the context of this code is typedefed as uint64_t, so what we're getting is just the integer value of the thread id.
Thread::id_t getId() { // This is awful. The Boost::thread implementation returns a thread_id class. // This is the only way to extract the actual value it carries, which is what a Thread::id_t // wants to be. In their Windows implementation, get_id() just returns an int, so we wouldn't // need this junk. std::stringstream ios; // This needs to be a pointer because on a *nix system, this_thread::get_id() // returns an object that defines operator<< to write the pthread_t to the stream, // and it's a pointer, so it gets formatted as hex and we can't change that by // inserting a dec manipulator. So when we read out of the stream, we need to // read into something for which a hex format makes sense. void *numericId;
// If this is called before start(), we're hosed assert (bthread_);
ios << bthread_->get_id(); ios >> numericId; // And, of course, static_cast can't be used to convert from void* to the integer type. return (Thread::id_t)numericId; }
- Rush_______________________________________________ Boost-users mailing list Boost-users@lists.boost.org http://lists.boost.org/mailman/listinfo.cgi/boost-users