【问题标题】:What are the meanings of parameters passed to sem_init() in Semaphores(Operating Systems)?信号量(操作系统)中传递给 sem_init() 的参数是什么意思?
【发布时间】:2017-03-30 18:26:39
【问题描述】:

考虑下面给出的代码 sn-p:

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

    sem_t empty;
    sem_t full;
    sem_t mutex;

    int main(int argc, char *argv[]) 
    {
    int MAX = 10;//Size of the Buffer
    sem_init(&empty, 0, MAX);
    sem_init(&full, 0, 0);
    sem_init(&mutex, 0, 1);

    return 0;
    }

只有必需的代码,我上面已经提到了。它是生产者-消费者代码的一部分。 sem_init()中各个参数的含义是什么?我可以看出第一个参数是信号量变量的地址,第三个是它的值。

为什么第二个参数总是0?这是什么意思?

我们是否使用第二个参数指定信号量等待的临界值?

    wait(S) {
    while (S <= 0 )
    ; // busy wait
    S--;
    }

如果我将 3 作为第二个参数传递给 sem_init(),是否将 wait(S) 中的 while 循环更改为

while (S <= 3 )

喜欢这样吗?

【问题讨论】:

  • 请阅读手册页。更好的是这里的解释,并且将是完整的

标签: c operating-system mutex semaphore producer-consumer


【解决方案1】:

请查看http://man7.org/linux/man-pages/man3/sem_init.3.html。关于第二个论点:

pshared 参数指示是否要共享此信号量 在进程的线程之间,或在进程之间。

这本质上是布尔值,但请阅读链接了解更多信息。如果你真的是线程比这应该总是 0,在极端情况下,你在不同进程上使用线程代码使用非零。

【讨论】:

    【解决方案2】:

    总是尝试阅读 Linux 文档 (man &lt;command or system_call&gt;) 来解决这类疑问。

    针对您的情况man sem_init
    sem_init() 在指向的地址初始化未命名的信号量 到 sem。 value 参数指定初始值 信号。

    手册页的 web link

    【讨论】:

    • 我从没想过它可以是命令行语句。我试图根据t c语言的观点来解决它。
    • 它可能是一个系统调用。 OS 提供了 C 语言的系统调用实用程序,因为 Linux 内核本身是用 C 语言编写的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-13
    • 1970-01-01
    • 2020-06-11
    • 2013-07-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多