Discussion:
[thread] getting thread id number
Hipatia
2009-04-24 18:47:02 UTC
Permalink
Hi!

I'm trying to get the id number of a thread just to write it to the standard
output.

Since I'm not an expert in c++ programming, let me explain what I do (even
if it's quite simple): a create an instance as follows,
boost::thread::id thread_id= boost::this_thread::get_id();
By debugging my code with Visual Studio, I see that 'thread_id' has an
'unsigned int' object member called 'id', so I would like to display this
value.
Unfortunately, I cannot find in the boost documentation any function member
of boost::thread::id class that returns its value.

Thanks,
Hipatia.
--
View this message in context: http://www.nabble.com/-thread--getting-thread-id-number-tp23222717p23222717.html
Sent from the Boost - Users mailing list archive at Nabble.com.
Rush Manbert
2009-04-24 21:24:13 UTC
Permalink
Post by Hipatia
Hi!
I'm trying to get the id number of a thread just to write it to the standard
output.
Since I'm not an expert in c++ programming, let me explain what I do (even
if it's quite simple): a create an instance as follows,
boost::thread::id thread_id= boost::this_thread::get_id();
By debugging my code with Visual Studio, I see that 'thread_id' has an
'unsigned int' object member called 'id', so I would like to display this
value.
Unfortunately, I cannot find in the boost documentation any function member
of boost::thread::id class that returns its value.
The id class defined operator<<, so just do this:

std::cout << "Thread id is: " << boost::this_thread::get_id();

I just did a replacement of a pthread implementation with a boost
thread implementation, and I needed to get the numeric value of the
data member, which I did like this (Thread::id_t is a typedef for
uint64_t):

Thread::id_t getId() {
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.
Stupid. Just stupid.
void *numericId;

ios << this_thread::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;
}

It's a hack, I know, but I couldn't think of anything else.

- Rush
Hipatia
2009-04-25 08:59:33 UTC
Permalink
Actually I may have simplified my request too much.
At first, I used to do what you propose me, that is,
std::cout << "Thread id is: " << boost::this_thread::get_id();
But this command gives back the address of the 'thread_data' object rather
than the actual thread id number. Still, it is a good solution.

But since I create several threads each one writing to the standard ouput, I
need a mutex-based function that centralizes all the writing:
void writeout(std::string message);
(this function not only writes the thread's id number but also other
information)
So now I need the thread id converted into a string :(

Any suggestion?
Thanks,
Hipatia
Post by Rush Manbert
Post by Hipatia
Hi!
I'm trying to get the id number of a thread just to write it to the standard
output.
Since I'm not an expert in c++ programming, let me explain what I do (even
if it's quite simple): a create an instance as follows,
boost::thread::id thread_id= boost::this_thread::get_id();
By debugging my code with Visual Studio, I see that 'thread_id' has an
'unsigned int' object member called 'id', so I would like to display this
value.
Unfortunately, I cannot find in the boost documentation any function member
of boost::thread::id class that returns its value.
std::cout << "Thread id is: " << boost::this_thread::get_id();
I just did a replacement of a pthread implementation with a boost
thread implementation, and I needed to get the numeric value of the
data member, which I did like this (Thread::id_t is a typedef for
Thread::id_t getId() {
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.
Stupid. Just stupid.
void *numericId;
ios << this_thread::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;
}
It's a hack, I know, but I couldn't think of anything else.
- Rush
_______________________________________________
Boost-users mailing list
http://lists.boost.org/mailman/listinfo.cgi/boost-users
--
View this message in context: http://www.nabble.com/-thread--getting-thread-id-number-tp23222717p23229970.html
Sent from the Boost - Users mailing list archive at Nabble.com.
Nigel Rantor
2009-04-25 11:37:46 UTC
Permalink
Post by Hipatia
Actually I may have simplified my request too much.
At first, I used to do what you propose me, that is,
std::cout << "Thread id is: " << boost::this_thread::get_id();
But this command gives back the address of the 'thread_data' object rather
than the actual thread id number. Still, it is a good solution.
But since I create several threads each one writing to the standard ouput, I
void writeout(std::string message);
(this function not only writes the thread's id number but also other
information)
So now I need the thread id converted into a string :(
I think you may misunderstand the idea behind the thread_id object.

The thread_id returned is only useful to *identify* threads.

It provides a full set of comparison operators but doesn't actually
provide *any* user-visible data members.

In other words the "thread id number" you are talking about simply does
not exist.

The boost thread library is multiplatform, if you look deeper into the
source you'll see that the thread_data definition depends on the
platform so if boost were to support yet another threading model in the
future you may not see the overloaded << operator printing the address
of the thread local storage but something else.

If you *want* or *need* some way of mapping a thread_id object to some
integral value then you can maintain a map of thread_id --> int, the
thread_id instance can be used as a key because of the ordering
guarantees it provides.

Hope that makes sense,

Nigel
Hipatia
2009-04-25 20:15:35 UTC
Permalink
Hi again!

It's quite possible that I may have been focusing on the wrong class.
Nonetheless... let me show you what I see when debugging with Visual Studio.
If I create an object like:
boost::thread::id thread_id= boost::this_thread::get_id();
I see this in the watch window:
thread_id
|-> thread_data
|-> _p
|-> [boost::detailt....]
|-> _vfptr
|-> count
|-> thread_handle
|-> interruption_handle
|-> thread_exit_callbacks
|-> tss_data
|-> interruption_enabled
|-> id
This last parameter (an unsigned integer) is the one that I want to
retrieve.

By the way, in Visual Studio there is a thread watch window in which I can
see the current existing threads and their associated ID numbers. Thus, both
the id shown in this window and the one shown in the thread_id properties
are the same.
Post by Nigel Rantor
Post by Hipatia
Actually I may have simplified my request too much.
At first, I used to do what you propose me, that is,
std::cout << "Thread id is: " << boost::this_thread::get_id();
But this command gives back the address of the 'thread_data' object rather
than the actual thread id number. Still, it is a good solution.
But since I create several threads each one writing to the standard ouput, I
void writeout(std::string message);
(this function not only writes the thread's id number but also other
information)
So now I need the thread id converted into a string :(
I think you may misunderstand the idea behind the thread_id object.
The thread_id returned is only useful to *identify* threads.
It provides a full set of comparison operators but doesn't actually
provide *any* user-visible data members.
In other words the "thread id number" you are talking about simply does
not exist.
The boost thread library is multiplatform, if you look deeper into the
source you'll see that the thread_data definition depends on the
platform so if boost were to support yet another threading model in the
future you may not see the overloaded << operator printing the address
of the thread local storage but something else.
If you *want* or *need* some way of mapping a thread_id object to some
integral value then you can maintain a map of thread_id --> int, the
thread_id instance can be used as a key because of the ordering
guarantees it provides.
Hope that makes sense,
Nigel
_______________________________________________
Boost-users mailing list
http://lists.boost.org/mailman/listinfo.cgi/boost-users
--
View this message in context: http://www.nabble.com/-thread--getting-thread-id-number-tp23222717p23236018.html
Sent from the Boost - Users mailing list archive at Nabble.com.
Igor R
2009-04-25 21:18:00 UTC
Permalink
              |-> id
This last parameter (an unsigned integer) is the one that I want to
retrieve.
By the way, in Visual Studio there is a thread watch window in which I can
see the current existing threads and their associated ID numbers. Thus, both
the id shown in this window and the one shown in the thread::id properties
are the same.
This is implementation detail that boost.thread doesn't expose. But as
already proposed, you can make std::map<thread::id, int> that maps
thread_id objects to windows-specific thread-id, like this:

std::map<thread::id, DWORD> ids;
ids[myThread.get_id()] = GetThreadID(myThread.native_handle());
vicente.botet
2009-05-27 22:52:58 UTC
Permalink
----- Original Message -----
From: "Hipatia" <***@yahoo.es>
To: <boost-***@lists.boost.org>
Sent: Friday, April 24, 2009 8:47 PM
Subject: [Boost-users] [thread] getting thread id number
Post by Hipatia
Hi!
I'm trying to get the id number of a thread just to write it to the standard
output.
Since I'm not an expert in c++ programming, let me explain what I do (even
if it's quite simple): a create an instance as follows,
boost::thread::id thread_id= boost::this_thread::get_id();
By debugging my code with Visual Studio, I see that 'thread_id' has an
'unsigned int' object member called 'id', so I would like to display this
value.
Unfortunately, I cannot find in the boost documentation any function member
of boost::thread::id class that returns its value.
Hi,

have you tried with the native_hadle() function. One major caveat: you can not revover directly the current boost::thread using the interface provided by the library,incroyable, isn't it? So you will need to maintain a map from boost::thread::id to boost::thread* or native_handle_type

HTH,
Vicente

Continue reading on narkive:
Loading...