[Mingw-w64-public] Fwd: [patch] Reimplement GNU threads library on native Windows

JonY 10walls@gmail.com
Mon Jul 29 14:45:00 GMT 2019


On 7/3/19 12:55 PM, Liu Hao wrote:
> 在 2019/7/2 下午8:27, Jonathan Wakely 写道:
>>
>> What do you mean by "unclosed thread"? If I read it correctly, the MSDN
>> page
>> refers to closing a handle (which makes sense), not closing a thread.
>>
> 
> Yes, it meant a thread which has terminated but not deleted due to some
> handles left open.
> 
> 
>>> This could also mean that there is no effect way to denote a thread
>>> uniquely. As a consequence libstdc++ may have to its own bookkeeping
>>> mechanism.
>>
>> As I said in my last mail, libstdc++ does not need a way to denote a
>> thread uniquely.
>>
> 
> At my last glance at the `__gthread_` interfaces, libstdc++ requires
> thread IDs to be LessThanComparable, which would require retrieval of
> thread IDs by handle, as in `__gthread_equal()`.
> 
> More than that, if my previous vision was correct (a terminated thread
> has no ID associated) then `GetThreadId()` on a thread that has
> terminated would not return a valid thread ID. Fortunately, this seems
> not the case:
> 
> ```c
> #include <windows.h>
> #include <stdio.h>
> 
> DWORD __stdcall ThreadProc(void* pParam)
>   {
>     printf("thread %lu running\n", GetCurrentThreadId());
>     return 0;
>   }
> 
> int main(void)
>   {
>     HANDLE hThread = CreateThread(0, 0, ThreadProc, 0, CREATE_SUSPENDED, 0);
>     printf("thread %lu created\n", GetThreadId(hThread));
> 
>     ResumeThread(hThread);
>     WaitForSingleObject(hThread, INFINITE);
>     printf("thread %lu terminated\n", GetThreadId(hThread));
> 
>     CloseHandle(hThread);
>     // `hThread` is now invalid; DO NOT PLAY WITH THIS AT HOME!
>     printf("thread %lu closed\n", GetThreadId(hThread));
>   }
> ```
> 
> This program outputs
> 
> ```text
> E:\Desktop>gcc test.c -Wall -Wextra -Wpedantic && a.exe
> test.c: In function 'ThreadProc':
> test.c:4:34: warning: unused parameter 'pParam' [-Wunused-parameter]
>     4 | DWORD __stdcall ThreadProc(void* pParam)
>       |                            ~~~~~~^~~~~~
> thread 9172 created
> thread 9172 running
> thread 9172 terminated
> thread 0 closed
> 
> E:\Desktop>
> ```
> 
> Despite Microsoft's documentation, the identifier of a thread seems
> uncollected as long as there are still handles to the thread. So it
> might be safe to assume that the identifier of an `std::thread` *cannot*
> be reused before it is `join()`'d or `detach()`'d which closes the
> handle stored in the `std::thread` object.
> 
> 

Any updates?

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: OpenPGP digital signature
URL: <http://gcc.gnu.org/pipermail/libstdc++/attachments/20190729/cae211f3/attachment.sig>


More information about the Libstdc++ mailing list