【问题标题】:sem_init(...): What is the pshared parameter for?sem_init(...): pshared 参数是干什么用的?
【发布时间】:2010-11-20 11:09:54
【问题描述】:

在研究生课程中,我们不得不使用信号量来完成线程工作。

我们被指示使用sem_init 和一堆其他 sem_* 过程,但我们没有得到关于这些 sem_* 方法的详细信息的太多信息。

sem_init的原型(和头文件)是the following

#include <semaphore.h>

int sem_init(sem_t *sem, int pshared, unsigned int value);

但我不明白 pshared 值的用途。根据opengroup.org

如果pshared 参数有一个非零 值,则共享信号量 进程之间;在这种情况下,任何 可以访问信号量的进程 sem 可以使用 sem 进行表演 sem_wait(), sem_trywait(), sem_post(), 和sem_destroy() 操作。

但我想我不明白 1,2、10、25、50000 等之间的区别。我认为这是说如果值为 0 则不共享信号量。 (但是,有什么意义呢?)

如何正确使用这个pshared参数?

【问题讨论】:

    标签: multithreading semaphore


    【解决方案1】:

    我会说值 s 1、2、5 等相对于shared 参数没有显着差异。可能是这样写的,因为在第一次创建 API 时,C 没有布尔类型。

    【讨论】:

    • 这是否使它成为过时的 API?
    • 我不知道 - 有时使用旧的“经过试验和测试”的 API 也是有价值的。您必须从效率和明显的安全漏洞等角度来看待它,以确定它是否真的过时了
    • 偷偷摸摸:是和不是。不,Pthreads,更现代的选择,似乎没有信号量实现,所以对于那些你想要信号量的情况,这是你需要使用的 API。是的,在大多数情况下,互斥体和条件可以很好地代替信号量。
    【解决方案2】:

    sem_init 的 GLIBC 版本(如果你在 Linux 上使用man sem_init,你会得到什么)有这样的说法:

    "pshared 参数表示该信号量是否是 在进程的线程之间或进程之间共享。”

    所以pshared 是一个布尔值:实际上传递给它的有意义的值是false (0) 和true (1),尽管任何非0 值都将被视为真。如果您将其传递为 0,您将获得一个信号量,该信号量可以被同一进程中的其他线程访问——本质上是一个进程内锁。您可以将其用作互斥体,也可以将其更广泛地用于信号量的资源计数属性。可以说,如果 pthreads 支持信号量 API,你就不需要 sem_init 的这个特性,但是 Unix 中的信号量在 pthreads 之前相当长一段时间。

    如果布尔值是某种枚举(例如SEM_PROCESS_PRIVATESEM_PROCESS_SHARED)会更好,因为那样你就不会有这个问题,但是POSIX 信号量是一个相当古老的API,因为这些事情发生了。

    【讨论】:

    • 称这个版本属于GLIBC并不是PC。这是 POSIX.1-2001。
    • 您可以使用pthread.h 中的PTHREAD_PROCESS_PRIVATEPTHREAD_PROCESS_SHARED,它们恰好具有正确的值(并非巧合)。
    【解决方案3】:

    pshared 参数指示该信号量是在进程的线程之间还是在进程之间共享。

    如果 pshared 的值为 0,则信号量在进程的线程之间共享,并且应该位于对所有线程可见的某个地址(例如,全局变量或在堆上动态分配的变量)。

    如果 pshared 不为零,则信号量在进程之间共享,并且应该位于共享内存区域中(请参阅 shm_open(3)、mmap(2) 和 shmget(2))。 (由于 fork(2) 创建的子进程继承了父进程的内存映射,它也可以访问信号量。)任何可以访问共享内存区域的进程都可以使用 sem_post(3)、sem_wait(3) 等对信号量进行操作.

    【讨论】:

      【解决方案4】:

      pshared 参数表示该信号量是在进程的线程之间还是在进程之间共享。如果 pshared 的值为 0,则信号量在进程的线程之间共享,并且应该位于某个所有线程可见的地址。如果 pshared 不为零,则信号量在进程之间共享,并且应该位于共享内存区域中。

      【讨论】:

      • 这个答案相对于这里的其他答案有什么附加价值?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-10-22
      • 1970-01-01
      • 2011-10-03
      • 2017-03-30
      • 2013-03-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多