> On May 24, 2020, at 11:11 AM, Jonathan Wakely <jwakely....@gmail.com> wrote:
> 
> On Sun, 24 May 2020 at 18:55, Florian Weimer wrote:
>> 
>> * Thomas Rodgers:
>> 
>>> +      static __gthread_t
>>> +      _S_get_tid() noexcept
>>> +      {
>>> +#ifdef __GLIBC__
>>> +     // For the GNU C library pthread_self() is usable without linking to
>>> +     // libpthread.so but returns 0, so we cannot use it in single-threaded
>>> +     // programs, because this_thread::get_id() != thread::id{} must be 
>>> true.
>>> +     // We know that pthread_t is an integral type in the GNU C library.
>>> +     if (!__gthread_active_p())
>>> +       return 1;
>>> +#endif
>>> +     return __gthread_self();
>>> +      }
>> 
>> This comment seems outdated or incomplete.  pthread_self returns a
>> proper pointer since glibc 2.27, I believe.
> 
> The comment is copied from the <thread> header, and dates from 2015.

Yes, this comes from <thread> to avoid pulling in all of <thread> to just get a 
hash from the current thread identity. I’m now using it in two places, is this 
worth splitting out somewhere?

> 
>> I'm also not sure how the difference is observable for the libstdc++
>> implementation.  Late loading of libpthread isn't quite supported.
> 
> It's nothing to do with late loading. A single threaded program that
> doesn't create any threads and doesn't link to libpthread can still
> expect std::this_thread::get_id() != std::thread::id() to be true in
> the main (and only) thread. If pthread_self() returns 0, and
> thread::id() default constructs with a value of 0, then we can't
> distinguish "the main thread" from "not a thread".
> 
> But I do see a non-zero value from glibc now, which is great. I'll add
> it to my TODO list to remove that workaround from <thread>.

Reply via email to