2013-08-18 39 views

回答

2

好,差应或多或少明显从man sem_init

  • 如果pshared == 0则信号灯会不会是当前进程外部可见的,并且它可能会在这个过程结束后自动销毁。因此,仅在属于此进程的线程之间进行同步才是有用的,并且由于线程始终共享内存,因此sem参数可以由任何线程直接使用,而无需进一步的操作。

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

当然,你也可以使用一个非零的pshared信号同步线程,只是忽略了过程中的一部分。但是进程信号使用更多的资源,通常是一个操作系统对象,而线程信号通常可以在用户空间中100%实现;所以这只是在浪费资源。