Opened 11 years ago

Closed 11 years ago

#5843 closed Bugs (invalid)

thread.cpp: thread::join() does not throw for a non-joinable thread

Reported by: noloader@… Owned by: viboes
Milestone: Component: thread
Version: Boost 1.47.0 Severity: Problem
Keywords: Cc: viboes

Description

Boost uses non-joinable threads. For example, under Windows:

thread::thread() : m_joinable(false)
{
    m_thread = reinterpret_cast<void*>(GetCurrentThread());
    m_id = GetCurrentThreadId();
}

The thread::join() properly asserts the property, but still attempts to join a non-joinable thread:

void thread::join()
{
    assert(m_joinable); //See race condition comment below
    int res = 0;

    res = WaitForSingleObject(reinterpret_cast<HANDLE>(m_thread), INFINITE);
    assert(res == WAIT_OBJECT_0);
    res = CloseHandle(reinterpret_cast<HANDLE>(m_thread));
    assert(res);
    // This isn't a race condition since any race that could occur would
    // have us in undefined behavior territory any way.
    m_joinable = false;
}

Related to https://svn.boost.org/trac/boost/ticket/5838 and https://svn.boost.org/trac/boost/ticket/5842.

Change History (5)

comment:1 by Jeffrey Walton <noloader@…>, 11 years ago

Component: Nonethread
Owner: set to Anthony Williams

assert(res == WAIT_OBJECT_0) might be too tight - assert(res == WAIT_OBJECT_0 || res == WAIT_ABANDONED_0) might be a better choice.

comment:2 by viboes, 11 years ago

Cc: viboes added

I don't know IIUC the interface, but IMO, a thread that has already finished can not be joined. Do you agree with my understanding?

Preconditions:

this->get_id()!=boost::this_thread::get_id()

Effects:

If *this refers to a thread of execution, waits for that thread of execution to complete.

Postconditions:

If *this refers to a thread of execution on entry, that thread of execution has completed. *this no longer refers to any thread of execution.

Throws:

boost::thread_interrupted if the current thread of execution is interrupted.

Notes:

join() is one of the predefined interruption points.

comment:3 by viboes, 11 years ago

Cc: viboes removed
Owner: changed from Anthony Williams to viboes
Status: newassigned

comment:4 by viboes, 11 years ago

Cc: viboes added
Type: BugsSupport Requests

Moved to support until the resolution is clarified.

comment:5 by viboes, 11 years ago

Milestone: To Be Determined
Resolution: invalid
Status: assignedclosed
Type: Support RequestsBugs
Note: See TracTickets for help on using tickets.