Это в значительной степени точно , как я делал это в прошлом.
main:
claim mutex
for each desired thread:
start child
release mutex
:
child:
claim mutex
release mutex
:
Обратите внимание, что на самом деле это не гарантирует, что все потоки были запущены до того, как первый начнет что-то делать, просто основной поток создал их.
Для этого вы можете использовать что-то вроде следующего метода:
main:
claim mutex
set unstarted to 0
for each desired thread:
start child
add 1 to unstarted
release mutex
:
child:
claim mutex
subtract 1 from unstarted
while unstarted > 0:
release mutex
yield // if necessary
claim mutex
release mutex
:
Независимо от того, какую инициализацию должен выполнить поток, чтобы считать его запущенным, произойдет между claim
и subtract
.
Из дальнейших исследований я вижу, что барьеры на самом деле являются более элегантным способом сделать это. На самом деле они не были доступны в тех реализациях pthread, которые я использовал, поэтому мой код может показаться немного многословным.
Однако я оставлю это как есть на случай, если кто-то использует pthreads до v6 или другой метод многопоточности (без барьеров), и потому что, как задан вопрос, это равно другой способ сделать это.