WaitForSingleObject et WaitForMultipleObjects équivalent sous Linux?
Je suis de la migration d'une application de windows à linux. Je suis confronté à problème à l'égard de WaitForSingleObject
et WaitForMultipleObjects
interfaces.
Dans mon application, j'ai engendrer de multiples threads où tous les threads en attente pour les événements de processus parent ou d'exécuter régulièrement pour toutes les t secondes.
J'ai vérifié pthread_cond_timedwait
, mais nous avons à spécifier temps absolu pour cette.
Comment puis-je mettre en œuvre cette sous Unix?
Vous devez vous connecter pour publier un commentaire.
En tenir à
pthread_cond_timedwait
et l'utilisationclock_gettime
. Par exemple:L'envelopper dans une fonction si vous le souhaitez.
Mise à JOUR: en complément de la réponse basée sur nos observations.
POSIX n'ont pas une seule API pour attendre "tous les types" des événements ou des objets que Windows ne. Chacun a ses propres fonctions. La façon la plus simple d'informer d'un thread pour la résiliation est à l'aide atomique variables/opérations. Par exemple:
Thread principal:
Thread secondaire:
Une autre alternative est d'envoyer une demande d'annulation à l'aide de
pthread_cancel
. Le fil annulé doit avoir appelépthread_cleanup_push
pour vous inscrire nettoyage nécessaire de gestionnaire. Ces gestionnaires sont appelés dans l'ordre inverse de leur enregistrement. Ne jamais appelerpthread_exit
à partir d'un gestionnaire de nettoyage, parce que c'est un comportement indéterminé. Le statut de sortie de l'annulation de la thread estPTHREAD_CANCELED
. Si vous optez pour cette solution, je vous recommande de lire principalement sur les points d'annulation et de types.Et le dernier mais non le moindre, l'appel de
pthread_join
fera le thread en cours de bloquer jusqu'à ce que le fil passé en argument se termine. En bonus, vous aurez le fil de sortie du statut.terminate event
? Une variable atomique partagée par tous les threads? Ou si vous voulez une suggestion de moi? Pour le parent-attendre-filetage de la partie, vous pouvez séquentiellement appelpthread_join
pour chaque fil que vous souhaitez attendre.terminate event
sans verrouillage, est une variable atomique, oupthread_cancel
+pthread_cleanup_push
. La première envoie une demande d'annulation de l'souhaité fil, et le second registres de nettoyage des rappels, et elle doit être invoquée par le fil lui-même. Le nettoyage des rappels sera invoquée lors d'une demande d'annulation. Je vous recommande de lire plus sur ce sujet, principalement des points d'annulation et de types. J'espère que cela va répondre à vos question(s).#include <atomic.h>
et#include <asm/atomic.h>
et les deux n'existe pas.include
dir pour le "chemin" pour la compilation - alors il va trouver de l'en-tête requis,<asm/atomic.h>
.Pour ce que ça vaut, nous (NeoSmart Technologies) vient de publier un open source (sous licence MIT) bibliothèque appelée pevents qui met en œuvre WIN32 manuel et auto-reset événements sur POSIX, et comprend à la fois WaitForSingleObject et WaitForMultipleObjects clones.
Bien que je serais personnellement vous conseillons d'utiliser POSIX multithreading et la signalisation des paradigmes lors du codage sur POSIX machines, pevents vous donne un autre choix si vous en avez besoin.
Je sais que c'est une vieille question maintenant, mais pour quelqu'un d'autre qui trébuche à travers elle, cette source suggère que pthread_join() n'est effectivement la même chose que WaitForSingleObject():
http://www.ibm.com/developerworks/linux/library/l-ipc2lin1/index.html
Bonne chance!
WaitForSingleObject
,WaitForMultipleObjects
et les amis aussi prendre un timout. Je ne crois paspthread_join
fournit.pthread_timedjoin_np
si elle est disponible sur votre système, fournit un paramètre de délai d'attentePour
WaitForMultipleObjects
avec de fauxWaitAll
essayez ceci: