Plus de threads créés que prévu

Vous pouvez trouver le programme ici

Je construis un programme dans le cadre de transmission de messages 0MQ. J’essaie de mettre en œuvre ce que j’ai posté ici

Programme compilé avec g++ -std=c++11 test.cpp -o test -lzmq -lpthread .

Pour exécuter le programme, transmettez un paramètre en tant que numéro de fil que vous souhaitez avoir. Ce paramètre est ensuite affecté à la variable worker_num .

Dans le fil principal, je crée le fil avec:

  vector pool; for(int i = 0; i < worker_num; i++) { cout << "main() : creating thread, " << i << endl; pool.push_back(thread(task1, (void *)&context, i)); } 

Je voudrais m’assurer que tous les threads de travail ont une connexion réussie au thread principal avant que le thread principal ne leur dissortingbue des tâches.

  while(true) { if(sync_done) { cout << "sync done in main thread" << endl; break; } zmq::message_t sync_msg(4); memcpy((void *)sync_msg.data(), SYNC_MSG, SYNC_MSGLEN); for(int i = 0; i < worker_num; i++) distask_socket.send(sync_msg); for(int i = 0; i < worker_num; i++) { if(sync_done) break; if(i != 0) this_thread::sleep_for(chrono::milliseconds(500)); zmq::message_t res_msg; int ret = getres_socket.recv(&res_msg, ZMQ_DONTWAIT); if(ret == -1 && errno == EAGAIN) continue; int threadID = stoi(string((char *)res_msg.data())); sync_done = if_sync_done(threadID, sync_array, worker_num); } } 

Ainsi, le thread principal fait: pousser #worker_num des msg de sync avec son sharepoint terminaison PUSH vers les threads de travail et lire ensuite le message de confirmation de son sharepoint terminaison PULL. Si le thread principal récupère le #worker_num des messages de confirmation, la synchronisation est effectuée. Le format du message de synchronisation de worker est le suivant: l’ID du thread de travail dans une chaîne. Ainsi, le thread 0 transmettrait un 0 dans la chaîne au thread principal.

Mais en exécutant le programme, j’ai:

 $ ./test 1 main() : creating thread, 0 thread id:0 thread 0 receives: sync thread 0 sends: 0 thread 0 sync done main thread receives sync msg from thread 1 # you may get many copies of this msg terminate called after throwing an instance of 'std::invalid_argument' what(): stoi Aborted 

main thread receives sync msg from thread 1 signifie que les threads sont créés: le thread 0 et le thread 1. Une idée pourquoi? J’ai passé 1 en paramètre. Notez que si vous exécutez le programme vous-même, vous obtiendrez d’autres résultats.

METTRE À JOUR:

Programme mis à jour: ici .

Finalement, j’ai compris ce qui n’allait pas.

sortie attendue, vous voyez le thread 0 passer un 0 au thread principal pour notifier la synchronisation effectuée:

 $ ./test 1 input parameter is: 1 main() : creating thread, 0 thread 0 receives: sync to_ssortingng 0 thread 0 sends: 0, with size: 1 thread 0 sync done pass 0 to if_sync_done main thread receives sync msg from thread 0 sync done in main thread 

sortie inattendue, vous voyez que le caractère non imprimable est passé à stoi() :

 $ ./test 1 input parameter is: 1 main() : creating thread, 0 thread 0 receives: sync to_ssortingng 0 thread 0 sends: 0, with size: 1 thread 0 sync done pass to if_sync_done # !!!!! terminate called after throwing an instance of 'std::invalid_argument' what(): stoi Aborted 

Il semble donc que j’utilise mal message_t . Je dois donc veiller à ce qu’avant que le thread principal passe le contenu à stoi() , le tampon existe toujours.

Je vais append une réponse moi-même.

     zmq::message_t msg_back((void *)to_ssortingng(id).c_str(), to_ssortingng(id).size() + 1, NULL); 

    zmq::message_t constructeur de zmq::message_t vous utilisez ne fait pas de copie du tampon si on doit en croire [1] et [2] . Au lieu de cela, il prend possession du tampon.

    Cependant, vous passez un tampon géré par un temporaire; ce tampon est détruit dès le retour du constructeur. Vous avez msg_back stocker un pointeur en msg_back . Toute tentative d’utilisation de ce pointeur – par exemple, essayer de lire le message du côté du destinataire – présente un comportement indéfini.