c - 如何在 C 中初始化二进制信号量

标签 c linux semaphore init

man page似乎即使您将信号量初始化为值 1:

sem_init(&mySem, 0, 1);

它仍然可以通过多次调用增加到大于 1 的值

sem_post(&mySem);

但是在这个code example评论似乎有不同的想法:

sem_init(&mutex, 0, 1);      /* initialize mutex to 1 - binary semaphore */

是否可以在 C 中初始化一个严格的二进制信号量?

注意:在这种情况下,这样做而不是使用互斥锁的原因是 sem_post 和 sem_wait 可能会被不同的线程调用。

最佳答案

如果您想要在 Linux 上使用严格的二进制信号量,我建议使用互斥锁和条件变量构建一个信号量。

struct binary_semaphore {
    pthread_mutex_t mutex;
    pthread_cond_t cvar;
    bool v;
};

void mysem_post(struct binary_semaphore *p)
{
    pthread_mutex_lock(&p->mutex);
    if (p->v)
        abort(); // error
    p->v = true;
    pthread_cond_signal(&p->cvar);
    pthread_mutex_unlock(&p->mutex);
}

void mysem_wait(struct binary_semaphore *p)
{
    pthread_mutex_lock(&p->mutex);
    while (!p->v)
        pthread_cond_wait(&p->cvar, &p->mutex);
    p->v = false;
    pthread_mutex_unlock(&p->mutex);
}

关于c - 如何在 C 中初始化二进制信号量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7478684/

相关文章:

c - 我想让我的素数测距程序用 C 语言运行得更快

c++ - 在哪些情况下我需要锁定变量以防止同时访问?

c - fork 后的 Unix dup 管道

c - 服务器监听多个端口 c

c - 指向结构成员的指针

linux - 我不清楚一个重定向运算符,那就是 <<

linux - 带有 flock 的简单 cron 无法在 Ubuntu 上运行

c++ - UNIX/OSX 版本的 semtimedop

java - 从 ActionPerformed 调用方法并在主线程上运行它

c++ - Windows Metro 模式 (C++) : Waiting on semaphore (WaitForSingleObjectEx): failed with Access Denied [partially solved]