2009-07-09 8 views
8

Z pthread_cond_t mamy skojarzyć mutex, gdy sygnalizacja stanu Widziałem takie jakzadzwoń pthread_cond_broadcast z mutex w posiadaniu, czy nie? Kod

pthread_mutex_lock(&mutex); 

//code that makes condition true 

pthread_cond_broadcast(&cond); 
pthread_mutex_unlock(&mutex); 

i

pthread_mutex_lock(&mutex); 

//code that makes condition true 

pthread_mutex_unlock(&mutex); 
pthread_cond_broadcast(&cond); 

który z nich jest właściwy sposób? (Czy to ważne?)

Odpowiedz

13

Zależy od tego, co robią zlewy (i wszelkie inne źródła).

W twoim drugim przykładzie kodu, możliwe jest, że pomiędzy odblokowaniem a transmisją pojawi się grupa innych wątków i zrobi kombinację rzeczy, która sprawi, że warunek będzie znowu fałszywy. Będziesz transmitować bezcelowo. I niekoniecznie będziesz miał taki sam zestaw kelnerów, jak wtedy, gdy zmieniłeś warunek, który może lub nie może mieć wpływu na twój projekt.

Przyzwoite zlewozmywak nie powinien przejmować się, czy jest on budzony, a warunek jest fałszywy, zwłaszcza jeśli używasz transmisji. Tak długo, jak każda zmiana warunku na "true" w końcu następuje po emisji, jestem prawie pewna, że ​​z odpowiednio napisanymi zlewami, możesz emitować zmienną warunkową nie chcąc z lub bez blokady.

Więc nie sądzę, że to naprawdę ma znaczenie, ale osobiście transmitowałbym z zamkniętą blokadą, gdyby tylko nie musiał się o to martwić. "Atomowa zmiana i sygnał" może uprościć diagram stanu na twojej tablicy w porównaniu z "zmianą ... jakiś czas później sygnałem".

Obie są poprawne (w przeciwieństwie do oczekiwania bez muteksu, co nie jest dozwolone), ale nie sądzę, że byłoby zbyt trudno wymyślić zastosowania, które mogą pójść nie tak w drugim przypadku, że nie pomylisz się w pierwszym. Prawdopodobnie będą musieli zaangażować niektórych kelnerów robiących nieco niecodzienne rzeczy.

W specyfikacji dość tajemniczo mówi się "jeśli wymagane jest przewidywalne zachowanie harmonogramu, to muteks będzie zablokowany przez wątek wywołujący pthread_cond_broadcast() lub pthread_cond_signal()."

http://www.opengroup.org/onlinepubs/009695399/functions/pthread_cond_signal.html

+0

Masz to samo pytanie Znalazłem twoją odpowiedź. Podążyłem za twoim linkiem i myślę, że nieco, że cytujesz jest związany z wcześniejszym bitem: "Jeśli więcej niż jeden wątek jest zablokowany na zmiennej warunku, polityka planowania określa kolejność, w której wątki są odblokowane." – wilx

+0

@wilx: tak, moim zmartwieniem jest to, co jest dozwolone przez "nieprzewidywalne zachowanie harmonogramu". Załóżmy na przykład, że masz program planujący, który jest udokumentowany lub ma opcję, że muteksy i warunkowe zmienne wybierają wątek do wybudzenia na podstawie FIFO. Czy "tajemnicze" zdanie sugeruje, że zachowanie nie ma być FIFO, jeśli wywołujący 'pthread_cond_signal' nie trzyma muteksu? Tak sądzę, ale nie znam formalnej definicji "przewidywalnej", dlatego uważam ją za zagadkową. Z wyjątkiem systemu RT zawsze traktuję planowanie jako nieco nieprzewidywalne, ale nie chcę, żeby się dziwił. –

+0

Nie ma znanego przypadku, w którym ważne jest, czy transmisja jest przeprowadzana przed odblokowaniem, czy po nim. Z wielkim trudem można skonstruować kod, który łamie się, jeśli przesuniesz sygnał po odblokowaniu. –