C语言 如果我使用sem_open()而不是sem_init(),信号量的pshared值是什么? &g



我目前正在研究使用信号量和进程的用餐哲学家问题,我使用sem_open()函数来创建信号量而不是sem_init()。由于sem_open()不以pshared值作为参数。有人能给我一个很好的解释,当使用sem_open()时,信号量是如何在进程之间共享的?我想这可能是因为信号量在文件系统中是打开的,但如果能有更多的说明就更好了。

在Linux/glibc下,POSIX信号量是用基于futexes的pthread互斥量实现的。pshared参数与传递给pthread_mutexattr_setpshared的互斥锁属性有关。可能的值为:

  • PTHREAD_PROCESS_PRIVATE对于进程内部的互斥锁(这是pthread库中的默认设置);
  • PTHREAD_PROCESS_SHARED用于在访问包含对象的内存的任何线程之间共享的互斥锁,包括不同进程中的线程。

当用sem_open()创建信号量时,它被认为是进程和线程之间可共享的。也就是说,当我们将pshared设置为非零时,它的行为类似于sem_init()
内部,sem_open()/dev/shm中创建了一个文件,其中存储了sem_t结构。通过调用mmap(NULL, sizeof (sem_t), PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0)将文件映射到调用进程内存中,其中fd是打开文件的文件描述符。因此,这就是信号量在进程之间共享的方式,因为它们都在其地址空间中映射相同的文件内容。
作为旁注,sem_open()返回的值是从底层文件映射的sem_t结构的内存地址。

最新更新