Multithreading 什么';在进程线程之间共享信号量和在进程之间共享信号量有什么区别?

Multithreading 什么';在进程线程之间共享信号量和在进程之间共享信号量有什么区别?,multithreading,concurrency,pthreads,Multithreading,Concurrency,Pthreads,我目前正在学习POSIX线程,并致力于从整体上掌握并发性。我现在正在查看手册页以了解更多信息。它需要一个参数来定义传递给它的信号量是在线程之间共享(零)还是在进程之间共享(非零)。有人能给我一个很好的解释一下这里的区别吗。我想我了解基本知识,但一些建议和澄清将是非常感谢的。好吧,从man sem\u init来看,差异应该或多或少是明显的: 如果pshared==0,则信号量在当前进程外部将不可见,并且在该进程完成时可能会自动销毁。因此,只有在属于此进程的线程之间进行同步才有用,而且由于线程始

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

好吧,从
man sem\u init
来看,差异应该或多或少是明显的:

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

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

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