信号量何时初始化为 0?

bad*_*dri 0 c

我看到一段代码中使用了 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,也会运行相同的代码。

Joh*_*ger 5

我看到一段代码中使用了 0 值。我们使用值 1 表示二进制信号量,使用值 N 表示计数信号量。不知何故,0 的值对我来说没有意义。

0 是每个信号量都可以取的值。因此,用该值初始化信号量是完全合理的。

如果使用 0 或 1 都可以,那么为什么这个程序不运行 [...]

只是因为它总体上是合理的信号量初始化为零

任何给定时间信号量的值都会影响其行为。特别是,sem_wait()尝试减少信号量而不将其值减少到零以下,并阻塞直到它可以这样做。因此,如果您用值零初始化信号量,则尝试使用该信号量的每个线程sem_wait()都会阻塞,直到某个线程通过 增加其值sem_post()。如果您将信号量用作互斥体(如示例代码所示),那么您可以将其描述为互斥体最初被锁定。