Wiem, jak wysyłać sygnały do procesu potomnego w C, używając funkcji kill(pid_t pid, int sig)
. A co z wysyłaniem sygnałów do wątków? Czy to możliwe?. Jeśli tak, to jak przechwytywać sygnały w wątku "potomnym". Na przykład, jeśli główny wątek wysyła mi sygnał zakończenia, jak mogę go w innym wątku złapać.Wysyłaj i przejmuj sygnały do pthreadów w C
Odpowiedz
Z wątkami POSIX, masz funkcje pthread_cond_wait
i pthread_cond_signal
.
int pthread_cond_wait(pthread_cond_t *restrict cond, pthread_mutex_t *restrict mutex)
int pthread_cond_signal(pthread_cond_t *cond)
sygnalizowanym gwint powinny blokować na pthread_cond_wait
rozmowy, dopóki inna nić wysyła sygnał przez pthread_cond_signal
, o tej samej wielkości stanu.
Biorąc pod uwagę analogię z sygnałami dostarczanymi do procesów, jest to nieco inne, ponieważ sygnalizowany wątek zawiesił już swoje wykonanie w oczekiwaniu na sygnał, w przeciwieństwie do procesu, który po prostu zostaje przerwany i trwa.
nie jestem pewien, że to jest możliwe, ponieważ jest to platforma i zależna od implementacji i bardzo proponuję nie używać sygnałów do komunikacji między wątkami. Czasami tylko określony wątek będzie odbierać sygnały, a czasami wszystkie wątki odbierają sygnały.
Lepsze mechanizmy komunikacji między wątkami istnieją, jak kolejki, semafory i blokady.
Sygnały nie mają powinowactwa wątku. Są one obsługiwane całkowicie asynchronicznie. Po określeniu obsługi sygnału za pomocą signal(2)
lub sigaction(2)
, jest to globalna procedura obsługi sygnału. Kiedy sygnał jest podniesiony, procedura obsługi sygnału działa na szczycie stosu, niezależnie od tego, która wątek działa w tym czasie, i nie możesz tego kontrolować.
Wygląda na to, że chcesz mieć coś w rodzaju komunikacji międzywymiarowej. Najprostszym sposobem na to jest ze zmienną volatile
shared:
volatile bool should_terminate = false;
void ChildThread()
{
while(!should_terminate)
{
// do stuff
}
}
void MainThread()
{
// To terminate child thread:
should_terminate = true;
}
Jeśli potrzebujesz silniejszej kontroli współbieżności, zajrzeć do muteksy, zmiennych stanu, i semafory.
Sygnały są wysyłane do procesu jako całości. Każdy sygnał wysłany do procesu jest odbierany przez pojedynczy wątek (w imieniu całego programu). Istnieją maski sygnałów na wątek, które mają wpływ na to, czy dany wątek może obsłużyć konkretny sygnał.
Potrzebny jest więc program obsługi sygnału - prawdopodobnie w jednym wątku. Zauważ, że istnieją ograniczenia co do tego, co powinieneś zrobić w obsłudze sygnału wątku. Uważaj, aby nie przekroczyć obietnic złożonych przez standard (które są minimalne).
Jednak funkcja pthread_kill()
może być używana do wysyłania sygnałów do innych wątków, o ile bieżący wątek może zidentyfikować (ma dostęp do wartości identyfikatora wątku (pthread_t
), które identyfikują) wątki, które wciąż są wykonywane w procesie. Możesz zdecydować o przekazaniu sygnału do innych wątków, używając innego numeru sygnału od pierwotnie złapanego (tak, że jeden wątek odbiera sygnał zewnętrzny, ale wiele wątków odbiera sygnał wewnętrzny). Lub możesz użyć innej synchronizacji Pthread lub podstawowej komunikacji zamiast sygnałów.
Chciałbym wyjaśnić "ma dostęp do identyfikatora wątku". Jeśli chodzi o poprawność formalną, nawet jeśli masz zapisane 'pthread_t', to jest ono nieważne (niezdefiniowane zachowanie), aby użyć go, jeśli wątek mógł zostać zakończony w stanie odłączonym lub z innym wątkiem, który już na nim wywołuje' pthread_join'. –
- 1. Czego potrzebuję do debugowania pthreadów?
- 2. kaskady i sygnały/gniazda
- 3. Sygnały w Linq do Sql?
- 4. Wysyłaj NSArray do javascript
- 5. Przerwanie dwóch pthreadów blokujących według sygnałów
- 6. Xcode Wyjdź kody i sygnały
- 7. Sygnały Qt (QueuedConnection i DirectConnection)
- 8. Sygnały i gniazda, wzór w Qt?
- 9. Wywołanie API POSIX do wyświetlenia wszystkich pthreadów działających w procesie
- 10. Usuwanie obiektów wysyła sygnały, własności obiektów w sygnały, Qt
- 11. Sygnały Django w selerze
- 12. W jaki sposób Qt implementuje sygnały i gniazda?
- 13. Wysyłaj lub wysyłaj wiadomość do pętli komunikatów Windows Forms
- 14. Debuguj sygnały Qt, gniazda i połączenia
- 15. Wysyłaj dane do określonego wątku
- 16. Wysyłaj logi heroku do s3
- 17. Wysyłaj i odbieraj dane TCP w ruby
- 18. Wysyłaj przekierowania do określonych portów
- 19. sygnały lub wyzwalacze w SQLAlchemy
- 20. Pytanie Qt: Jak działają sygnały i gniazda?
- 21. Co to są sygnały i gniazda?
- 22. Wysyłaj parametry do pliku lokalnego w UIWebView
- 23. Zmiana limitu maksymalnej liczby pthreadów przez aplikację
- 24. Podłącz sygnały do gniazd o stałych wartościach
- 25. Przeciążone sygnały pyside (QComboBox)
- 26. Sygnały złapania Golanga
- 27. Jak przechwytywać sygnały w programie PowerShell?
- 28. Sygnały a sygnały2
- 29. sygnały Django nie działa
- 30. Jak tworzyć dynamiczne sygnały i gniazda w Qt?
To jest zupełnie inne niż sygnały. Chociaż zgodziłbym się, że jest to zwykle lepsze podejście, myślę, że "pthread_kill" jest odpowiedzią na pytanie OP. –
@R ..: Właściwie to pytanie nie jest zbyt jasne i założyłem, że autor nie pyta o dostarczanie sygnałów systemu operacyjnego do konkretnego wątku, ale raczej o wysyłanie sygnałów między wątkami. –