Hi. I believe that there is a bug in thread::thread() under Windows. The code uses GetCurrentThread() WinAPI function, but this is not enough. If you'll try to create such a thread object, and pass its reference to another thread which will join it - something like struct SomeThread { thread *m_thread; SomeThread(thread *a_thread) : m_thread(a_thread) { } void operator()() { do_some_work() m_thread->join(); delete m_thread; } }; { ...somewhere in the code... SomeThread st(new thread()); thread other_thread(st); } then it won't work. The following is a quote from MSDN about GetCurrentThread(): "The return value is a pseudo handle for the current thread... A pseudo handle is a special constant that is interpreted as the current thread handle... The function cannot be used by one thread to create a handle that can be used by other threads to refer to the first thread. The handle is always interpreted as referring to the thread that is using it. A thread can create a "real" handle to itself that can be used by other threads, or inherited by other processes, by specifying the pseudo handle as the source handle in a call to the DuplicateHandle function." The conclusion is that a call to DuplicateHandle() is needed after GetCurrentThread(). Thanks, Yuval