Question

Je suis en train de construire une mince C ++ wrapper autour pthreads pour une utilisation en interne. Windows ainsi que QNX sont ciblées et heureusement les ports pthreads-win32 semble fonctionner très bien, alors que QNX est conforme à nos POSIX pour des raisons pratiques.

, en mettant en œuvre sémaphores, je frappe la fonction

sem_post_multiple(sem_t*, int)

qui est apparemment disponible uniquement sur pthreads-win32 mais manque de QNX. Comme son nom l'indique la fonction est censée augmenter la sémaphores par le nombre donné comme second argument. Pour autant que je peux dire la fonction ne fait pas partie de ni 1b ni Posix 1c Posix.

Bien qu'il n'y ait actuellement aucune exigence pour cette fonction, je me demande encore pourquoi pthreads-win32 fournit la fonction et si elle pourrait être utile. Je pourrais essayer de mimer pour QNX en utilisant semblable au suivant:

sem_post_multiple_qnx(sem_t* sem, int count)
{
   for(;count > 0; --count)
   {
       sem_post(sem);
   }
} 

Qu'est-ce que je demande sont suggestion / conseils sur la façon de procéder. Si le consensus suggère de mettre en œuvre la fonction faire pour QNX Je voudrais également apprécier des commentaires sur si le code suggéré Snipped est une solution viable.

Merci à l'avance.

PS: Je délibérément laissé ma fantaisie C ++ classe pour plus de clarté. Pour tous les gens qui suggère coup de pouce à la rescousse: il n'est pas une option dans mon projet actuel pour des raisons de gestion

.
Était-ce utile?

La solution

Dans tous les sémaphores de cas sont une extension optionnelle dans POSIX. OS X ne par exemple semble pas les mettre pleinement en œuvre. Donc, si vous êtes concernés par la portabilité, vous auriez à fournir des emballages des fonctionnalités dont vous avez besoin, de toute façon.

Votre approche pour émuler un incrément atomique par itérée sem_post a certainement des inconvénients.

  • Il pourrait être de mauvais résultats, où habituellement sem_t sont utilisés dans performances des contextes critiques.
  • Cette opération ne serait pas atomique. Donc, les choses confuses pourraient se produire avant que vous avez terminé la boucle.

Je tiendrais au juste nécessaire, strictement conforme POSIX. Attention que sem_timedwait est encore une autre partie facultative de l'option sémaphores.

Autres conseils

Votre projet d'implantation d'sem_post_multiple ne joue pas bien avec sem_getvalue, puisque sem_post_multiple est une augmentation atomique et donc il est impossible pour un appel « simultanée » à sem_getvalue pour retourner l'une des valeurs intermédiaires.

Personnellement, je veux les laisser à la fois sur: essayer d'ajouter des opérations de synchronisation fondamentales à un système qui leur manque est le jeu d'une tasse, et votre emballage pourrait bientôt cesser d'être « mince ». Ne soyez donc pas en elle sauf si vous avez le code qui utilise sem_post_multiple, que vous devez absolument port.

sem_post_multiple () est une fonction d'assistance non-standard introduite par les mainteneurs Win32-pthreads. Votre mise en œuvre ne sont pas les mêmes que les leurs parce que les multiples décréments ne sont pas atomiques. Que ce soit ou non un problème dépend de l'utilisation prévue. (Personnellement, je ne voudrais pas essayer de mettre en œuvre cette fonction à moins / jusqu'à ce que le besoin se fait sentir.)

Ceci est une question intéressante. +1.

Je suis d'accord avec le consensus actuel qui prévaut ici qu'il est probablement pas une bonne idée de mettre en œuvre cette fonction. Bien que votre mise en œuvre proposée serait probablement fonctionnent très bien dans la plupart des situations, il y a certainement des conditions dans lesquelles les résultats pourraient être considérablement différents en raison de la non-atomicité. Ci-dessous un (très) la situation artificielle:

  • A qui Démarrer fil appelle sem_post_multiple (s, 10)
  • Discussion B attente sur s est libéré. Fil B tue le thread A.

Dans ce qui précède le scénario hostile, la version atomique aurait entraîné un accroissement des sémaphores par 10. Avec la version non-atomique, il ne peut être incrémenté une fois. Cet exemple est certainement peu probable que dans le monde réel. Par exemple, le meurtre d'un fil est presque toujours une mauvaise idée de ne pas mentionner le fait qu'il pourrait laisser l'objet sémaphores dans un état non valide. La mise en œuvre Win32 pourrait laisser un mutex sur le Sémaphore - voir ce pourquoi .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top