/ / Czy możemy osiągnąć zachowanie semafora za pomocą prymitywów synchronizacji w bibliotece pthread? - c, linux, wielowątkowość, semafor

Czy możemy osiągnąć zachowanie semafora za pomocą prymitywów synchronizacji w bibliotece pthread? - c, linux, wielowątkowość, semafor

Przeszedłem przez API semaforów oferowane w Linuksie. Byłoby to proste użycie semafora

sem_wait()
//do something
sem_post()

Czy podobne zachowanie można osiągnąć za pomocą dostępnych prymitywów synchronizacji w bibliotece pthread?

Po przejściu przez POSIX API "mam wymyślić następujący kod:

int a = COUNT_LIMIT; //global variable
pthread_mutex_t m1;
pthread_cond_t c1;

pthread_mutex_lock(&m1);
while(a==0){
pthread_cond_wait(&c1, &m1);
}
a--;
//do whatever i want to do, as resource is available
pthread_cond_signal(&c1,&m1);
pthread_mutex_unlock(&m1);

Sądzę, że ten kod wystarczyłby, ale jaka jest najlepsza praktyka, aby osiągnąć to zachowanie?

Odpowiedzi:

2 dla odpowiedzi № 1

Powinieneś trzymać muteks tylko podczas testowania i zmiany a.

sem_wait() {
pthread_mutex_lock(&m1);
while (a == 0) pthread_cond_wait(&c1, &m1);
a--;
pthread_mutex_unlock(&m1);
}
sem_post() {
pthread_mutex_lock(&m1);
a++;
pthread_cond_signal(&c1);
pthread_mutex_unlock(&m1);
}

Prawdziwe pytanie brzmi: czemu chciałbyś semafory? Chyba że naprawdę masz zestaw naprawdęnierozpoznawalne zasoby muteksy są łatwiejsze do zrozumienia, ponieważ wymagają one ich odblokowania. Na przykład za pomocą muteksów można wykonać wykrywanie zakleszczenia, wykrywając cykle na wykresie oczekiwania, podczas gdy dla semaforów należy użyć bardziej skomplikowanych algorytmów wykrywania zakleszczeń, takich jak Algorytm bankowy Dijkstry.