我目前正在学习 POSIX 线程,并致力于从整体上掌握并发性。我现在正在查看sem_init()
. 它需要一个参数来定义传递给它的信号量是在线程之间共享(零)还是在进程之间共享(非零)。有人可以给我一个很好的解释这里的差异。我想我了解基础知识,但非常感谢一些建议和澄清。
问问题
562 次
1 回答
3
好吧,差异应该或多或少明显man sem_init
:
如果
pshared == 0
那么信号量在当前进程之外将不可见,并且当该进程完成时它很可能会被自动销毁。因此,只有在属于该进程的线程之间进行同步才有用,并且由于线程始终共享内存,因此sem
任何线程都可以直接使用该参数,而无需进一步操作。如果
pshared != 0
那么此信号量将可供其他进程使用,前提是它们可以访问 指向的内存sem
。为此,您将需要共享内存或在创建信号量fork()
后使用继承它。此外,如果您没有明确销毁信号量,在某些实现中(我不知道是哪些),信号量可能会泄漏。
当然,您可以使用非零 pshared信号量来同步线程而忽略进程部分。但是进程信号量使用更多的资源,通常是一个 OS 对象,而线程信号量通常可以 100% 在用户态实现;所以这样做只是在浪费资源。
于 2013-08-18T00:42:53.043 回答