【问题标题】:What's the difference between sharing a semaphore between threads of a process and sharing one between processes?在进程的线程之间共享信号量和在进程之间共享信号量有什么区别?
【发布时间】:2013-08-20 02:34:42
【问题描述】:

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

【问题讨论】:

    标签: multithreading concurrency pthreads


    【解决方案1】:

    嗯,与man sem_init的区别应该或多或少很明显:

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

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

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

    【讨论】:

      最近更新 更多