Понимание семафора (получение неверного конечного значения 1) - PullRequest
0 голосов
/ 21 ноября 2018

Я сделал семафор, инициализированный на 0. Я запускаю программу, создав три потока и затем вызывая sema_func (), где sema_wait () помещает их в список ожидания.Теперь я создаю 4-й поток, который вызывает один из потоков, вызывая функцию sema_wake ().Однако, когда все потоки просыпаются, я не должен получить окончательное значение 0 вместо 1?Пожалуйста, ведите меня

Мой код:

#include <pthread.h>
#include <stdio.h>
#include <semaphore.h>

sem_t mySema;

void *sema_func(void *param) {
	printf("SLEEPING THREAD %lu \n", pthread_self());

	sem_wait(&mySema);

	printf("WOKE THREAD %lu \n", pthread_self());

	sleep(1);

	sem_post(&mySema);

}

void *wake_func(void *param) {
	

	int sema_value = 0;

	sem_getvalue(&mySema, &sema_value);

	printf("SEMA VALUE: %d\n", sema_value);

	sem_post(&mySema);

	sleep(5);


	sem_getvalue(&mySema, &sema_value);

	printf("SEMA FINAL VALUE: %d\n", sema_value);



}

int main(int argc, char *argv[]) {
 sem_init(&mySema, 0, 0);
 pthread_t t1; pthread_t t2; pthread_t t3; pthread_t t4;

 pthread_create(&t1, NULL, sema_func, NULL);
 pthread_create(&t2, NULL, sema_func, NULL);
 pthread_create(&t3, NULL, sema_func, NULL);
 sleep(4);
 pthread_create(&t4, NULL, wake_func, NULL);
 sleep(10);
}

Вывод: -

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...