【问题标题】:Name and Unnamed Semaphore名称和未命名信号量
【发布时间】:2012-10-20 04:47:01
【问题描述】:

我试图了解命名信号量和未命名信号量之间的相似之处和不同之处,因此我的谷歌搜索产生了this。我对页面上的措辞有疑问,它说:

  • 未命名的信号量可能可供多个进程使用
  • 命名信号量可被多个进程共享

这两个词是否在这两种信号量之间产生了任何重要的区别,或者它们是不相关的?

到目前为止,这是我所拥有的:

Similarities
    -Several processes can do something with the semaphore

Difference
    -Named are referenced with pathname and unnamed are referenced by pshared value

这就是我可以从该定义中收集到的全部信息。这就是一切,它们是否正确?还是我遗漏了一些重要的概念?

【问题讨论】:

    标签: posix semaphore


    【解决方案1】:

    考虑可以访问信号量。

    未命名的信号量(缺少任何名称或句柄来定位它们)必须存在于某个预先存在的、商定的内存位置。在子进程的情况下,通常是(1)共享内存(由fork 之后的子进程继承);或 (2) 共享内存、全局变量或堆(如果它们在单个进程的线程之间共享)。这里最重要的是父、子或线程中的代码已经知道信号量的地址。

    命名信号量对于不相关的进程是必需的。例如,生产者和消费者可能由两个不同的开发人员编写,并作为完全不相关的进程运行。但是它们必须共享一些需要受信号量保护的资源。命名信号量为它们提供了信号量的路径。

    实际上,您可以在所有场景中使用命名信号量,但它们会带来一些额外的负担,因为您必须处理路径和权限,如果程序相关并且已经知道如何访问未命名的信号量,则这些都是不必要的信号。例如,使用命名信号量在线程之间共享资源有点愚蠢。线程已经可以访问可以驻留未命名信号量的同一内存。

    【讨论】:

      【解决方案2】:

      接受的答案是错误的(以及@electron 给出的另一个答案)。未命名的 POSIX 信号量可以被不相关的进程使用。您只需将数据结构存储在相关进程可访问的共享内存中,并将可共享标志设置为 1 进行初始化,如下所示(无耻地从 http://blog.superpat.com/2010/07/14/semaphores-on-linux-sem_init-vs-sem_open/ 复制):

      int shm;
      sem_t * mutex;
      
      if ((shm = shm_open("myshm", O_RDWR | O_CREAT, S_IRWXU))   0) {
          perror("shm_open");
          exit(1);
      }
      
      if (ftruncate(shm, sizeof(sem_t)) < 0 ) {
          perror("ftruncate");
          exit(1);
      }
      
      if ((mutex = mmap(NULL, sizeof(sem_t), PROT_READ | PROT_WRITE, MAP_SHARED, shm, 0)) == MAP_FAILED) {
          perror("mmap");
          exit(1);
      }
      
      if (sem_init(mutex, 1, 1) < 0) {
          perror("semaphore initialization");
          exit(1);
      }
      

      共享内存到其地址空间的另一个进程映射可以访问相同的信号量并与原始进程同步。另请参阅 sem_init() 及其 linux man page 的 POSIX 规范。

      【讨论】:

        【解决方案3】:

        命名信号量file system 中有一个actual name,并且可以由多个不相关的进程 成为shared

        未命名的信号量只能由属于同一进程threads使用。

        信号量创建使用函数

                         sem init(ptr_semaphore, flag, initial_value);
        

        在哪里

        ptr_semaphore:指向信号量的指针

        flag:表示共享级别的标志

        initial_value:信号量的初始值

        如果你将flag=0 传递给sem_init() 那么semaphore 可以 仅由属于创建信号量的进程的线程共享。因此它将创建未命名的信号量

                  sem_init(ptr_semaphore,0,initial_value)   //unamed semaphore
        

        传递一个非零值allow 其他进程也访问信号量。因此它会产生命名信号量

                  sem_init(ptr_semaphore,1,initial_value)   //named semaphore
        

        【讨论】:

        • “未命名的信号量只能由属于同一进程的线程使用” - 错误。
        猜你喜欢
        • 2012-08-01
        • 2012-08-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-04
        相关资源
        最近更新 更多