https://gcc.gnu.org/bugzilla/show_bug.cgi?id=89591

            Bug ID: 89591
           Summary: How can thread.joinable() reliably work if the
                    pthread_t id is not initialized?
           Product: gcc
           Version: 8.2.1
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: libstdc++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: bique.alexandre at gmail dot com
  Target Milestone: ---

Hi,

I've been reading the <thread> header and I've found that the thread id of
std::thread is not initialized, I hope that I'm wrong and I missed something.

So I wonder how std::thread.joinable() can work?

On top of that, pthread_t has no "invalid thread id" or "uninitialized thread
id" value. So I wonder how the whole logic can work.

To me if your only attribute is pthread_t, you can't know figure anything about
the thread, and even if the thread exists, there is no guarantee that the
current std::thread object created it: if you create a object: std::thread t;
then t.id will be uninitialized, so could very well point to an existing thread
right?

Regards,
Alex




From the header:

thread() noexcept = default;

and also:

    typedef __gthread_t                 native_handle_type;

    /// thread::id
    class id
    {
      native_handle_type        _M_thread;

    public:
      id() noexcept : _M_thread() { }

      explicit
      id(native_handle_type __id) : _M_thread(__id) { }

    private:
      friend class thread;
      friend class hash<thread::id>;

      friend bool
      operator==(thread::id __x, thread::id __y) noexcept;

      friend bool
      operator<(thread::id __x, thread::id __y) noexcept;

      template<class _CharT, class _Traits>
        friend basic_ostream<_CharT, _Traits>&
        operator<<(basic_ostream<_CharT, _Traits>& __out, thread::id __id);
    };

  private:
    id                          _M_id;



and then later:

typedef pthread_t __gthread_t;

Reply via email to