【问题标题】:What are some real world uses of the named semaphores?命名信号量在现实世界中有哪些用途?
【发布时间】:2018-11-07 09:18:57
【问题描述】:

在类 UNIX 系统中,我们既有未命名的信号量,也有命名的信号量。对于我所做的基本上所有事情,因为我必须将指针传递给要访问的实际数据,所以我总是设法将信号量传递给必须访问资源本身的任何线程。简单的技巧:用对象和信号量创建一个结构体。

在哪些情况下最好使用命名信号量?

【问题讨论】:

  • 您可以使用命名信号量在无法访问相同地址空间(因此不能共享相同指针)的多个进程之间进行同步。
  • @jspcal 所说的。请注意,这更像是一个 [操作系统] 或 [多线程] 问题,而不是 C。
  • 那么,如果我在进行分叉之前创建了一个未命名(甚至命名)的信号量怎么办?它是否会与所有进程的 PCB 一起被克隆,使得等待它变得毫无意义(因为每个进程都会等待它的副本而不与另一个进程交互)?否则,如果该信号量在各个进程之间保持相同(仅复制指向它的指针),则可能是另一种同步它们的方式。

标签: c multithreading unix concurrency semaphore


【解决方案1】:

正如 jspcl 所说。命名信号量用于进程之间的同步。两个进程之间不能共享相同的地址(因为在某些嵌入式操作系统中存在一些例外,例如完整性,qnx 等)。因为每个进程有不同的地址空间,地址页不同。

因此命名的信号量用于访问进程之间的共享内存。

例如, Linux 中的 shmget() posix 调用用于命名信号量。在此调用中,您必须使用 char* 的信号量名称以及进程内存的读写权限。它将返回与共享内存关联的信号量的文件描述符。之后,您必须调用 mmap 以获取共享内存地址。通过它你可以读取和写入共享内存。

现实世界的示例是使用多个处理器的航空业。一个进程将与其他电子部件交互并将信息发送到其他处理器。因此在其他处理器中必须有可以从串口读取数据然后发送到其他进程的进程。所以这里使用了名为信号量的多进程通信

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-08
    • 1970-01-01
    • 1970-01-01
    • 2020-03-20
    • 2014-09-27
    • 2012-01-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多