Issue 125428
Summary std::async in future does not throw system_error as required (libc++)
Labels libc++
Assignees
Reporter slotosch
    During the qualification of the C++ STL for safety we run into a corner case, which seam to be a clear, safety relevant bug (violation of requriements) and error handling is very safety critical. We found it in C++14, but it is also present in current version.
The C++14 requirement in 30.6.8 states for 
Functions `std::async`
template <class F, class... Args>
future<result_of_t<decay_t<F>(decay_t<Args>...)>> async(F&& f, Args&&... args);

template <class F, class... Args>
future<result_of_t<decay_t<F>(decay_t<Args>...)>> async(launch policy, F&& f, Args&&... args);
Requirement 30.6.8-6,7

6 Throws: system_error if policy == launch::async and the implementation is unable to start a new thread.

7 Error conditions:
— **resource_unavailable_try_again — if policy == launch::async and the system is unable to start a new thread.**

**Steps to reproduce:**

    Set limit of threads using 
    Linux, MacOS: setrlimit(RLIMIT_NPROC, lim)
    QNX: setrlimit(RLIMIT_NTHR, lim)

Note 1: Use RLIMIT_NTHR for the number of threads per process on QNX. Linux and MacOS (pthread) does not support RLIMIT_NTHR and control the total number of Linux threads/processes with RLIMIT_NPROC. QNX has different threading model.

Note 2. Use reasonable limit numbers. Request the current limits first and do not exceed the current rlim_cur value. 
    Call async function with std::launch::async policy multiple times, more then rlim_cur value.

**Expected behavior:**

The function throws std::system_error exception which application may catch.

**Actual behavior:**

Application hangs.

**Issue analysis:**
In gcc (linux) the exception message is reported correctly.

Also a related bug report is found in another project. However it seems not reported to the LLVM development.
https://github.com/emscripten-core/emscripten/issues/8988 

**Workaround (big pain!):**
Control the number of active threads created with `async` call and do not exceed the limits.

** Example to reproduce (using attached async_ex.txt)
[async_ex.txt](https://github.com/user-attachments/files/18633380/async_ex.txt)

See the difference in GNU libstdc++ and LLVM libc++ using Linux:
   clang++ -stdlib=libc++ -o async_ex async_ex.txt
   ./async_ex
This hangs

   clang++ -stdlib=libstdc++ -o async_ex async_ex.txt
   ./async_ex
Output:
   Expected exception: Resource temporarily unavailable
_______________________________________________
llvm-bugs mailing list
llvm-bugs@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs

Reply via email to