我看到一段代码中使用了 0 值。我们使用值 1 表示二进制信号量,使用值 N 表示计数信号量。不知何故,0 的值对我来说没有意义。
/* Initialise the semaphore to be blocked. */
sem_t sem;
sem_init(&sem, 0, 0);
Run Code Online (Sandbox Code Playgroud)
代码是用C语言编程的。然后像往常一样,我们在代码中的其他地方有 sem_wait、sem_post 和 sem_destroy。
如果使用 0 或 1 都可以,那么为什么这个程序不运行 -
#include <stdio.h>
#include <pthread.h>
#include <semaphore.h>
#include <unistd.h>
sem_t mutex;
void* thread(void* arg)
{
//wait
sem_wait(&mutex);
printf("\nEntered..\n");
//critical section
sleep(4);
//signal
printf("\nJust Exiting...\n");
sem_post(&mutex);
}
int main()
{
sem_init(&mutex, 0, 0);
pthread_t t1,t2;
pthread_create(&t1,NULL,thread,NULL);
sleep(2);
pthread_create(&t2,NULL,thread,NULL);
pthread_join(t1,NULL);
pthread_join(t2,NULL);
sem_destroy(&mutex);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
如果使用 sem_init(&mutex, 0, 1); 完成 sem_init,也会运行相同的代码。
我看到一段代码中使用了 0 值。我们使用值 1 表示二进制信号量,使用值 N 表示计数信号量。不知何故,0 的值对我来说没有意义。
0 是每个信号量都可以取的值。因此,用该值初始化信号量是完全合理的。
如果使用 0 或 1 都可以,那么为什么这个程序不运行 [...]
只是因为它总体上是合理的信号量初始化为零
任何给定时间信号量的值都会影响其行为。特别是,sem_wait()尝试减少信号量而不将其值减少到零以下,并阻塞直到它可以这样做。因此,如果您用值零初始化信号量,则尝试使用该信号量的每个线程sem_wait()都会阻塞,直到某个线程通过 增加其值sem_post()。如果您将信号量用作互斥体(如示例代码所示),那么您可以将其描述为互斥体最初被锁定。