J'essaie de créer un programme multi-filetés et programme d'emploi
Le thread du givre d'emploi pousse les travaux sur la matrice avec des données retardées aléatoires. Elle peut être traitée 1 seconde plus tard ou 10000 ... plus tard plus tard, tout dépend du donateur.
Thread Thread Pour l'instant comme solution rapide, j'ai effectué un gestionnaire de signal avec Donc, dans Résumé Comment puis-je annuler le fichier note; J'utilise Pthread sur Linux avec le langage C. P>
note; Les retards sont dans les nanosecondes. Avec la configuration actuelle, je suis capable de frapper une perte de 50 μs. P> Nanosleep () Code> S Tailler le plus court travail retardé, puis le traiter et le supprimer de la matrice de travail.
Tout fonctionne bien, sauf si le giveur d'emploi pousse le travail différé plus court pour la matrice et le thread de travailleur toujours
Nanosleep () Code> S à l'ancien travail le plus court, il est donc possible de faire retarder plus que prévu. P>
signal () code> que la manutention
sigusr1 code> signal.
Lorsque le donneur d'emploi pousse le nouveau plus court qu'il envoie
sigusr1 code> à l'ensemble du programme et annule 'code> nanosleep () code>.
Mais je ne pense pas que c'est la meilleure façon de le faire car il envoie à l'ensemble du programme et je veux simplement annuler un
nanosleep () code>. P>
nanosleep () code> du fil principal sans toucher des signaux? P>
3 Réponses :
Vous pouvez éventuellement utiliser du MANPAGE: P>
La fonction Pthread_Kill () envoie le signal SIG au thread, un fil dans le même processus que l'appelant. Le signal est dirigé d'asynchronement au fil. P>
Si SIG est 0, aucun signal n'est envoyé, mais la vérification des erreurs est toujours effectuée. P>
blockQuote>
Cela ne devrait avoir un effet sur le thread unique que vous ciblez. P> pthread_kill () code> pour livrer le
sigusr1 code> sur un seul thread p>
Lorsque notre processus obtient le signal de l'extérieur de notre processus n'est pas Singal () code> la fonction enregistre toujours la fonction de maîtrise de signal? Comme lorsque vous envoyez un signal avec
htop code> ou
haut code> programme
@dvjawgvdhawgvbda Je ne suis toujours pas sûr si je comprends ce que tu veux dire. Vous avez écrit, que le signal est envoyé d'un autre fil; C'est, où pthread_kill () code> entre en jeu.
Oui, mais nous sommes toujours en mesure de le déclencher de l'extérieur et n'est-ce pas un problème? Les autres programmes ne peuvent pas envoyer sigusr1 code> à notre programme?
@dvjawgvdhawgvbda oui, bien sûr. Ou un SIGINT, SIGTERM ou SIGKILL. Pourquoi est-ce un problème?
Si nous obtenons de faux déclencheurs, ne pouvons-nous pas traiter les tâches erronées? comme tôt que prévu
@dvjawgvdhawgvbda Eh bien, si une personne est capable de envoyer des signaux par inadvertance ou même malicieusement à un processus critique, c'est toujours un problème. Vous pouvez limiter les possibilités pour cela en utilisant un autre ID utilisateur pour votre processus; Ensuite, seule la racine ou le même utilisateur peut envoyer des signaux à ce processus. Notez cependant que cela n'est pas spécifique à votre problème ici.
Vous avez un gros problème xy ici. Les couchages et les signaux ne sont pas le moyen de mettre en œuvre la coordination entre les threads. J'irais jusqu'à dire que dormir dans un programme multithreadé est presque toujours indicatif d'une sorte de bogue. P>
L'outil pour ce que vous essayez de faire est variables de condition em>. Si vous n'êtes pas familier avec eux, je recommanderais vivement Les variables de la condition font partie a > de Ce tutoriel . Au lieu de dormir, vos travailleurs devraient faire une attente em> à la variable de condition, appelée dans une boucle et sortant de la boucle lorsque la condition qu'elles attendent est vraie. P>
permet de dire que nous avons deux mautexes, on s'appelle Pour suspendre, j'utilise Source:
Stackoverflow.com/Questions/59286893/canceling-nanosleep-de-Another-Tronthread#Comment104779089_59286893 P> x code> autre est
y code> p> p>
x code> est utilisé pour le verrouillage général, comme N'essayez pas d'accès en même temps avec plusieurs threads.
pthread_mutex_lock code> et
pthread_mutex_unlock code> p>
y code> est utilisé pour
nanosleep code>.
pthread_cond_wait code>,
pthread_cond_timpedwait code> et
pthread_cond_signal code> p> p>
cond_wait code>
y code> puis reprendre avec
cond_signal code>
y code>. Si j'ai besoin de suspendre pendant un certain temps, comme
nanosleep code> i utilise
cond_timedwait code>
y code> et reprenez-le de la même manière
cond_signal code>
y code>. p>
Sonne comme un cas d'utilisation pour les variables de condition et pthread_cond_timpedwait