0
votes

Annuler Nanosleep () d'un autre fil

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 Nanosleep () 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 () S à l'ancien travail le plus court, il est donc possible de faire retarder plus que prévu.

Pour l'instant comme solution rapide, j'ai effectué un gestionnaire de signal avec signal () que la manutention sigusr1 signal. Lorsque le donneur d'emploi pousse le nouveau plus court qu'il envoie sigusr1 à l'ensemble du programme et annule 'code> nanosleep () . 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 () .

Donc, dans Résumé Comment puis-je annuler le fichier nanosleep () du fil principal sans toucher des signaux?

note; J'utilise Pthread sur Linux avec le langage C.

note; Les retards sont dans les nanosecondes. Avec la configuration actuelle, je suis capable de frapper une perte de 50 μs.


1 commentaires

Sonne comme un cas d'utilisation pour les variables de condition et pthread_cond_timpedwait


3 Réponses :


1
votes

Vous pouvez éventuellement utiliser pthread_kill () pour livrer le sigusr1 sur un seul thread

du MANPAGE:

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.

Si SIG est 0, aucun signal n'est envoyé, mais la vérification des erreurs est toujours effectuée.

Cela ne devrait avoir un effet sur le thread unique que vous ciblez.


6 commentaires

Lorsque notre processus obtient le signal de l'extérieur de notre processus n'est pas Singal () la fonction enregistre toujours la fonction de maîtrise de signal? Comme lorsque vous envoyez un signal avec htop ou haut 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 () 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 à 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.



1
votes

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.

L'outil pour ce que vous essayez de faire est variables de condition . Si vous n'êtes pas familier avec eux, je recommanderais vivement Les variables de la condition font partie de Ce tutoriel . Au lieu de dormir, vos travailleurs devraient faire une attente à la variable de condition, appelée dans une boucle et sortant de la boucle lorsque la condition qu'elles attendent est vraie.


0 commentaires

0
votes

permet de dire que nous avons deux mautexes, on s'appelle x autre est y

x 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 et pthread_mutex_unlock

y est utilisé pour nanosleep . pthread_cond_wait , pthread_cond_timpedwait et pthread_cond_signal

Pour suspendre, j'utilise cond_wait y puis reprendre avec cond_signal y . Si j'ai besoin de suspendre pendant un certain temps, comme nanosleep i utilise cond_timedwait y et reprenez-le de la même manière cond_signal y .

Source: Stackoverflow.com/Questions/59286893/canceling-nanosleep-de-Another-Tronthread#Comment104779089_59286893


0 commentaires