Piszę aplikację, która blokuje dane wejściowe z dwóch istreams
.Zabij zablokowane Zwiększenie :: Wątek
Czytanie z istream
jest wywoływaniem synchronicznym (blokującym), więc postanowiłem utworzyć dwa Boost::thread
s, aby wykonać odczyt.
Każdy z tych wątków może dostać się do "końca" (w zależności od odebranego wejścia), a po osiągnięciu "końca" oba strumienie wejściowe przestają odbierać. Niestety, nie wiem, co to zrobi.
Tak więc, nie mogę join()
na obu wątków, ponieważ tylko jeden wątek (nie może być określony z góry) rzeczywiście powróci (odblokować).
Muszę jakoś zmusić drugą do wyjścia, ale jest zablokowana, czekając na wejście, więc sama nie może zdecydować, że nadszedł czas na powrót (zmienne warunkowe lub co nie).
jest ich sposób albo:
- wysłać sygnał impuls :: wątek lub
- wymusić
istream
na "nie", lub - Zabić boost :: wątek?
Uwaga:
- Jednym z
istreams
jestcin
- próbuję ponownie uruchomić proces, więc nie mogę zamknąć strumienie wejściowe w taki sposób, że zabrania im resetowanie.
Edit:
- wiem, kiedy zostanie osiągnięty „koniec”, a ja wiem, który wątek został pomyślnie zakończone, a które musi być zabity. To zabójstwo, którego potrzebuję, aby dojść do porozumienia (lub inną strategię czytania z istream).
- muszę oba wątki, aby wyjść i oczyszczanie prawidłowo :(
Dzięki!
Na szczęście pracuję dla maszyny na Linuksa, ale wolę wersję przenośną. Dzięki za to! – mmocny
pthread_cancel() nie robi tego dla mnie w podobnym scenariuszu, nawet nie ustawiając jego typu anulowania na ASYNCHRONOUS. – gatopeich