C'est à peu près exactement comment je l'ai fait dans le passé.
main:
claim mutex
for each desired thread:
start child
release mutex
:
child:
claim mutex
release mutex
:
Notez que cela ne garantit en fait que tous les fils ont commencé avant que la première commence à faire quelque chose, juste que le thread principal qui les a créés.
Pour ce faire, vous pouvez utiliser quelque chose comme la méthode suivante:
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
:
Quelle que soit l'initialisation d'un fil doit faire pour être considéré comme commencé aura lieu entre le claim
et le subtract
. Je vois d'après une enquête plus approfondie que les barrières sont en fait un moyen plus élégant de le faire. Ils n'étaient pas réellement disponibles dans les implémentations pthread que j'ai utilisées, ce qui explique pourquoi mon code peut sembler un peu bavard.
Cependant, je vais laisser tel quel sur le hasard que quelqu'un utilise des pthreads pré-v6 ou une méthode de threading différente (sans barrières) et parce que, comme la question l'a demandé, cette est différente de le faire.
Il existe des environnements dans lesquels cela n'est pas possible. Par exemple. ordinateurs à un seul cœur. –
@Georg ou de démarrer un tas de threads N + 1 sur un ordinateur N core, de sorte qu'il n'est pas possible en général sur un ordinateur dénombrable. –