/ / Можем ли да постигнем семафор като поведение, използвайки примитиви за синхронизация в библиотеката pthread? - c, linux, multithreading, семафор

Можем ли да постигнем семафорно поведение като използваме синхронизиращи примитиви в библиотеката pthread? - c, linux, multithreading, семафор

Преминах през семафорите на API, които се предлагат в Линукс. Едно просто използване на семафор ще бъде

sem_wait()
//do something
sem_post()

Може ли подобно поведение да бъде постигнато чрез използване на наличните синхронизиращи примитиви в библиотеката pthread?

След като мина през API на POSIX, аз излязох със следния код:

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);

Смятам, че този кодекс би направил този трик, но каква е най-добрата практика за постигане на това поведение?

Отговори:

2 за отговор № 1

Трябва да държите mutex само докато тествате и променяте 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);
}

Истинският въпрос е, защо бихте искали семафори? Освен ако наистина нямате набор от наистинанеразличими ресурси mutexes са склонни да бъдат по-лесно да се разсъждават, тъй като те изискват шкаф за да ги отключите. Например, с mutexes можете да направите откриване на безизходица чрез откриване на цикли в чакаща графика, докато за семафорите трябва да използвате по-сложни алгоритми за откриване на затваряне Алгоритъмът на Dijkstra Banker.