Consider this code snippet here, where I am trying to create a bunch of threads which end up processing a given task which simulates a race-condition.
const int thread_count = 128;
pthread_t threads[thread_count];
for (int n = 0; n != thread_count; ++n)
{
ret = pthread_create(&threads[n], 0, test_thread_fun, &test_thread_args);
if( ret != 0 )
{
fprintf( stdout, "Fail %d %d", ret, errno );
exit(0);
}
}
Things generally works fine except occasionally pthread_create fails with errno EAGAIN "resource temporarily unavailable", I tried inducing usleep, and retry creating but with no real effect.
the failure is sporadic and on some boxes no failures and on some occurs very frequently.
any Idea what could be going wrong here ?
Edit - 1
update on max-threads
cat /proc/sys/kernel/threads-max
256467
Edit 2
I think the inputs here kept me thinking, i'll probably do the below and post any results that are worth sharing.
If your program makes sure that it never creates more threads than the system limit allows for (by joining threads before creating new ones), then you are likely running into this kernel bug:
With certain kinds of container technology, the race window appears to be much larger, and the bug is much easier to trigger. (This might depend on the types of cgroups in use.)
There are not enough resources to start a new thread. Check if you have zombie threads on your system, or that you have enough memory etc on the system.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With