GNU/Linux >> Tutoriels Linux >  >> Linux

WaitForSingleObject et WaitForMultipleObjects équivalent sous Linux ?

Tenez-vous en à pthread_cond_timedwait et utilisez clock_gettime . Par exemple :

struct timespec ts;
clock_gettime(CLOCK_REALTIME, &ts);
ts.tv_sec += 10; // ten seconds
while (!some_condition && ret == 0)
    ret = pthread_cond_timedwait(&cond, &mutex, &ts);

Enveloppez-le dans une fonction si vous le souhaitez.

MISE À JOUR :compléter la réponse en fonction de nos commentaires.

POSIX n'a ​​pas une seule API pour attendre "tous les types" d'événements/objets comme le fait Windows. Chacun a ses propres fonctions. Le moyen le plus simple de notifier un thread pour l'arrêt est d'utiliser des variables/opérations atomiques. Par exemple :

Fil principal :

// Declare it globally (argh!) or pass by argument when the thread is created
atomic_t must_terminate = ATOMIC_INIT(0);

// "Signal" termination by changing the initial value
atomic_inc(&must_terminate); 

Fil secondaire :

// While it holds the default value
while (atomic_read(&must_terminate) == 0) {
    // Keep it running...
}
// Do proper cleanup, if needed
// Call pthread_exit() providing the exit status

Une autre alternative consiste à envoyer une demande d'annulation en utilisant pthread_cancel . Le fil en cours d'annulation doit avoir appelé pthread_cleanup_push pour enregistrer tout gestionnaire de nettoyage nécessaire. Ces gestionnaires sont appelés dans l'ordre inverse de leur enregistrement. N'appelez jamais le pthread_exit d'un gestionnaire de nettoyage, car il s'agit d'un comportement indéfini. Le statut de sortie d'un thread annulé est PTHREAD_CANCELED . Si vous optez pour cette alternative, je vous recommande de lire principalement sur les points et les types d'annulation.

Et enfin, appelez le pthread_join bloquera le thread en cours jusqu'à ce que le thread passé en argument se termine. En prime, vous obtiendrez le statut de sortie du fil.


Pour ce que ça vaut, nous (NeoSmart Technologies) venons de publier une bibliothèque open source (sous licence MIT) appelée pevents qui implémente les événements manuels et de réinitialisation automatique WIN32 sur POSIX, et inclut à la fois les clones WaitForSingleObject et WaitForMultipleObjects.

Bien que je vous conseille personnellement d'utiliser les paradigmes de multithreading et de signalisation POSIX lors du codage sur des machines POSIX, pevents vous donne un autre choix si vous en avez besoin.


Linux
  1. Démystifier les espaces de noms et les conteneurs sous Linux

  2. Linux - Sysfs et Devtmpfs ?

  3. Linux – Répertoires standard et/ou communs sur les systèmes Unix/linux ?

  4. Linux Supprimer des fichiers et des répertoires

  5. utilisation des caractères génériques linux dans cp et mv

Linux sur le mainframe :hier et aujourd'hui

Le noyau Linux et ses fonctions

Installer et configurer Ansible sous Linux

Installer et configurer Jenkins sous Linux

Utiliser l'équivalent du gestionnaire de tâches sous Linux

Présentation de RAMFS et TMPFS sous Linux