代码之家  ›  专栏  ›  技术社区  ›  Frank V

sem_init(…):pshared参数用于什么?

  •  11
  • Frank V  · 技术社区  · 15 年前

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

    我们被指示使用 sem_init 除了一堆其他的扫描电镜程序,我们没有得到关于每种扫描电镜方法的详细信息。

    的原型(和头文件) 扫描电镜初始化 the following :

    #include <semaphore.h>
    
    int sem_init(sem_t *sem, int pshared, unsigned int value);
    

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

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

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

    这个怎么用 共享的 参数?

    4 回复  |  直到 6 年前
        1
  •  13
  •   Frank V    10 年前

    glibc版本 sem_init (如果你 man sem_init 在Linux上)可以这样说:

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

    所以 pshared 是一个布尔值:实际上传递给它的有意义的值是 false ( 0 ) true ( 1 ,尽管任何非0值都将被视为真。如果传递0,您将得到一个信号量,这个信号量可以被同一进程中的其他线程访问——本质上是进程内锁。您可以将其用作互斥体,或者更一般地将其用于信号量的资源计数属性。如果pthreads支持信号量API,则不需要 扫描电镜初始化 但是在Unix中,信号量比pthreads早了一段时间。

    如果布尔值是某种枚举(例如 SEM_PROCESS_PRIVATE VS SEM_PROCESS_SHARED ,因为这样您就不会有这个问题了,但是POSIX信号量是一个相当古老的API。

        2
  •  1
  •   1800 INFORMATION    15 年前

    我想说的是,关于 shared 参数。可能是这样写的,因为当API第一次创建时,C没有布尔类型。

        3
  •  1
  •   man    9 年前

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

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

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

        4
  •  0
  •   Tobin_Karukulathel    6 年前

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