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