代码之家  ›  专栏  ›  技术社区  ›  Tim unnamed eng

为什么命名的信号量可以被任何进程中的线程使用?

  •  -1
  • Tim unnamed eng  · 技术社区  · 6 年前

    来自APUE

    POSIX信号量有两种avor:named和unnamed。他们不一样 它们是如何被创造和毁灭的,但在其他方面是一样的。 信号量只存在于内存中 并要求进程能够访问内存 映射相同内存的不同进程中的相同进程或线程 扩展到他们的地址空间。 命名信号量, 并且可以被任何进程中知道其名称的线程使用。

    “未命名信号量”只能由中的线程使用 映射相同内存的不同进程中的相同进程或线程 扩展到它们的地址空间”,因为“未命名的信号量只存在于内存中”。

    2 回复  |  直到 6 年前
        1
  •  1
  •   SKi    6 年前

    从手册页 sem_overview :

    在Linux上,命名信号量是在虚拟文件系统中创建的, 通常安装在/dev/shm下,名称形式为sem.somename

    因此,对于“任何进程中的线程”来说,它们的访问方式与普通文件类似。

    pthread库可以将这些文件映射到内存。

        2
  •  1
  •   rici    6 年前

    你倒过来想这个。问题是:“如果我需要在teo之间同步使用共享资源 无关的

    那为什么有用呢?嗯,用例可能并不常见——也许你从未遇到过——但它们确实存在。有许多资源在不相关的进程之间共享:数据库、配置文件、串行端口、打印机队列等等。您可以通过锁定文件在这些资源的共享使用之间进行调解,但这很笨拙,最终会在每个项目上重新发明轮子。另一方面,信号量易于使用,并且具有定义良好的文档化语义。

    信号量的使用实际上是在共享内存的相关进程之间进行的。而且您也不想为在文件系统中维护一个名称而支付不必要的开销。