Я сделал семафор, инициализированный на 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);
}
Вывод: -
