我目前正在学习POSIX线程并致力于掌握并发性。我现在正在查看sem_init()
的手册页。它需要一个参数来定义传递给它的信号量是在线程之间共享(零)还是在进程之间共享(非零)。有人可以在这里给我一个很好的解释。我认为我理解基础知识,但一些建议和澄清将是最受欢迎的。
答案 0 :(得分:2)
嗯,man sem_init
:
如果pshared == 0
那么信号量在当前进程之外将不可见,并且在此过程完成时可能会自动销毁。因此,仅在属于此进程的线程之间进行同步,并且由于线程始终共享内存,sem
参数可以由任何线程直接使用,而无需进一步操作。
如果pshared != 0
,则此信号量可供其他进程使用,前提是它们可以访问sem
指向的内存。为此,您需要共享内存或在创建信号量后使用fork()
继承它。此外,如果您没有明确销毁信号量,在某些实现中(我不知道哪些信号量)信号量可能会泄漏。
当然,您可以使用非零-pshared 信号量来同步线程,只是忽略进程部分。但是进程信号量使用更多资源,通常是OS对象,而线程信号量通常可以在用户区100%实现;所以这样做只是在浪费资源。