1

我目前正在学习 POSIX 线程,并致力于从整体上掌握并发性。我现在正在查看sem_init(). 它需要一个参数来定义传递给它的信号量是在线程之间共享(零)还是在进程之间共享(非零)。有人可以给我一个很好的解释这里的差异。我想我了解基础知识,但非常感谢一些建议和澄清。

4

1 回答 1

3

好吧,差异应该或多或少明显man sem_init

  • 如果pshared == 0那么信号量在当前进程之外将不可见,并且当该进程完成时它很可能会被自动销毁。因此,只有在属于该进程的线程之间进行同步才有用,并且由于线程始终共享内存,因此sem任何线程都可以直接使用该参数,而无需进一步操作。

  • 如果pshared != 0那么此信号量将可供其他进程使用,前提是它们可以访问 指向的内存sem。为此,您将需要共享内存或在创建信号量fork() 后使用继承它。此外,如果您没有明确销毁信号量,在某些实现中(我不知道是哪些),信号量可能会泄漏。

当然,您可以使用非零 pshared信号量来同步线程而忽略进程部分。但是进程信号量使用更多的资源,通常是一个 OS 对象,而线程信号量通常可以 100% 在用户态实现;所以这样做只是在浪费资源。

于 2013-08-18T00:42:53.043 回答