Currently, when exiting a thread's thrd_start_t function by returning from it, the behavior is unspecified. This ambiguity in the standard could be argued to imply the only way to saefly exit a thread is via a call to thrd_exit(). For example:int thread_func(void *arg) { /* Perform work */ thrd_exit(12); }However, the implied behavior of return a value from the thrd_start_t function is that the thread is terminated as though the user had called thrd_exit(), passing in the value returned from the function.
7.26.5.1p2, change:The thrd_create function creates a new thread executing func(arg). If the thrd_create function succeeds, it sets the object pointed to by thr to the identifier of the newly created thread. (A thread's identifier may be reused for a different thread once the original thread has exited and either been detached or joined to another thread.) The completion of the thrd_create function synchronizes with the beginning of the execution of the new thread.toThe thrd_create function creates a new thread executing func(arg). If execution of func(arg) is terminated via a return statement, the thread is terminated as though through a call to thrd_exit. If the thrd_create function succeeds, it sets the object pointed to by thr to the identifier of the newly created thread. (A thread's identifier may be reused for a different thread once the original thread has exited and either been detached or joined to another thread.) The completion of the thrd_create function synchronizes with the beginning of the execution of the new thread.