This is the mail archive of the pthreads-win32@sourceware.org mailing list for the pthreas-win32 project.
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
Other format: | [Raw text] |
A reasonably portable solution to this came up the other day (privately) in relation to using pthreads-win32 pthread_t with openssl. It is the following:
#define PT(t) (*((unsigned long *)&(t))) pthread_t thrA, thrB; ... PT(thrA) < PT(thrB)
etc.
Although this still relies on the pointer component being at offset 0 inside the pthread_t struct (which was made this way deliberately so probably won't change in the future), it does avoid having to explicitly use or know about ptw32_handle_t. You still lose the handle uniqueness "guarantee" that the pthread_t struct provides though, so that you then need to take extra care that the threads that you do this with don't detach without you realising it.
By the way, the pthread_t in pthreads-win32 is POSIX compliant. POSIX doesn't require pthread_t to be a scalar type, and in fact all but requires that POSIX compliant applications not presume the type of pthread_t.
Ross
Will Bryant wrote:
Hi Paolo,
Bear in mind that pthreads-win32 is written in C, and operator overloading is a C++ feature, so adding that would prevent pthreads-win32 from compiling with C apps.
One alternative is to make a custom comparator type and use that in the map declaration - or you could even simply move those operator overloads to your own units (they don't have to be defined where the type being compared is declared, as long as they've visible at the point where they're used - ie. your map declaration).
But bear in mind that in any case, making use of the ptw32_handle_t type makes your code nonportable, and since portability is generally the reason one is using pthreads-win32 in the first place, this is perhaps not the best design for general use.
Will
Paolo Brandoli wrote:
I have a source code that uses the pthread_t as a key in a std::map. Because pthread-win32 defines pthread_t as a structure, the compilation fails.
I added the following lines in my pthread.h header in order to allow the usage of pthread_t in the map:
bool operator < (const ptw32_handle_t& left, const ptw32_handle_t& right)
{
return left.p < right.p;
}
bool operator > (const ptw32_handle_t& left, const ptw32_handle_t& right)
{
return left.p > right.p;
}
Bye Paolo Brandoli http://www.puntoexe.com
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |