1144. "thread safe" is undefined

Section: 17.5 [support.start.term] Status: C++11 Submitter: LWG Opened: 2009-06-16 Last modified: 2016-01-28 10:19:27 UTC

Priority: Not Prioritized

View other active issues in [support.start.term].

View all other issues in [support.start.term].

View all issues with C++11 status.


Addresses UK 187

The term "thread safe" is not defined nor used in this context anywhere else in the standard.

Suggested action:

Clarify the meaning of "thread safe".

[ 2009 Santa Cruz: ]

The "thread safe" language has already been change in the WP. It was changed to "happen before", but the current WP text is still a little incomplete: "happen before" is binary, but the current WP text only mentions one thing.

Move to Ready.

Proposed resolution:

For the following functions in 17.5 [support.start.term].

extern "C" int at_quick_exit(void (*f)(void));
extern "C++" int at_quick_exit(void (*f)(void));

Edit paragraph 10 as follows. The intent is to provide the other half of the happens before relation; to note indeterminate ordering; and to clean up some formatting.

Effects: The at_quick_exit() functions register the function pointed to by f to be called without arguments when quick_exit is called. It is unspecified whether a call to at_quick_exit() that does not happen-before happen before (1.10) all calls to quick_exit will succeed. [Note: the at_quick_exit() functions shall not introduce a data race ( exitnote end note] [Note: The order of registration may be indeterminate if at_quick_exit was called from more than one thread. —end note] [Note: The at_quick_exit registrations are distinct from the atexit registrations, and applications may need to call both registration functions with the same argument. —end note]

For the following function.

void quick_exit [[noreturn]] (int status)

Edit paragraph 13 as follows. The intent is to note that thread-local variables may be different.

Effects: Functions registered by calls to at_quick_exit are called in the reverse order of their registration, except that a function shall be called after any previously registered functions that had already been called at the time it was registered. Objects shall not be destroyed as a result of calling quick_exit. If control leaves a registered function called by quick_exit because the function does not provide a handler for a thrown exception, terminate() shall be called. [Note: Functions registered by one thread may be called by any thread, and hence should not rely on the identity of thread-storage-duration objects. —end note] After calling registered functions, quick_exit shall call _Exit(status). [Note: The standard file buffers are not flushed. See: ISO C —end note]