spawn under restrictive process limits: "Error creating thread" + process hang

kdevel kdevel at vogtner.de
Wed Aug 6 20:48:20 UTC 2025


```D
import std;
import core.sys.posix.unistd : sleep;

void foo (size_t i)
{
    writeln (i);
    sleep (1);
    writefln ("thread %d end", i);
}

void main (string [] args)
{
    auto nthreads = args [1].to!size_t;

    Tid [] threads;
    foreach (i; 0 .. nthreads)
       threads ~= spawn (&foo, i);

    writeln ("main end");
}
```

If this code is started with the argument of `8` it runs and 
prints

```
0
main end
1
7
4
5
3
6
2
thread 0 end
thread 1 end
thread 7 end
thread 4 end
thread 5 end
thread 3 end
thread 6 end
thread 2 end
```

before control is transfered back to the shell. But if I start 
the program with sufficiently low setting of the maximum number 
of processes (say `ulimit -u 120`) the process prints

```
0
core.thread.threadbase.ThreadError at src/core/thread/threadbase.d(1224): Error creating thread
----------------
2
1
6
4
5
3
thread 0 end
thread 2 end
thread 1 end
thread 6 end
thread 4 end
thread 5 end
thread 3 end
```

and then hangs. According to gdb there is only one thread running 
which shows the following stackdump:

```
(gdb) bt
#0  0x00007ffff6a5ecb7 in sched_yield () at 
../sysdeps/unix/syscall-template.S:81
#1  0x00007ffff7c3b80d in core.thread.osthread.thread_yield() () 
from [...]/linux/lib64/libphobos2.so.0.110
#2  0x00007ffff7c3a151 in thread_joinAll () from 
[...]/linux/lib64/libphobos2.so.0.110
#3  0x00007ffff7c43d55 in rt_term () from 
[...]/linux/lib64/libphobos2.so.0.110
#4  0x00007ffff7c442fd in rt.dmain2._d_run_main2() () from 
[...]/linux/lib64/libphobos2.so.0.110
#5  0x00007ffff7c441e6 in rt.dmain2._d_run_main2() () from 
[...]/linux/lib64/libphobos2.so.0.110
#6  0x00007ffff7c4414f in _d_run_main2 () from 
[...]/linux/lib64/libphobos2.so.0.110
#7  0x00007ffff7c43f38 in _d_run_main () from 
[...]/linux/lib64/libphobos2.so.0.110
#8  0x0000000000415226 in main (argc=2, argv=0x7fffffffdd38)
     at 
[...]/linux/bin64/../../src/druntime/import/core/internal/entrypoint.d:29
```

It appears to me that there is an endless loop of calls to 
`sched_yield`. Do I miss something?


More information about the Digitalmars-d-learn mailing list