我正在考虑更改一些我想在linux,unix和OSX上运行的代码。代码中有一些调用sem_init,但pshared值设置为零。我在Rochkind关于unix编程的书中做了一些阅读,他基本上说没有共享的sem_init与pthread_mutex_init相同,因为它以内存中的二进制方式运行。
问题是 - 我可以安全地将这些sem_init更改为pthread_mutex_init,还是使用sem_open来获取此代码的更便携版本?
OSX不支持未命名的信号量,但我猜其他两个信号量。我真的不希望单独的编译标志#ifdef(__APPLE__)
或其他东西。
由于
答案 0 :(得分:8)
互斥量和信号量具有不同的语义。必须通过锁定的同一线程解锁互斥锁。因此,锁定/解锁必须始终在同一个帖子中成对出现。
信号量更灵活,因为另一个线程可以发布另一个线程消耗的令牌。它们通常用于实现生产者/消费者模式。因此,如果它符合互斥体的受限语义,则必须检查要移植的程序。
答案 1 :(得分:2)
互斥锁和信号量的语义不同。确实,非共享信号量等效于互斥量,如果它仅用作二进制信号量,即它的值永远不会大于1.但是,这是您需要根据代码的逻辑确定的,而不是如何已初始化。如果您确定信号量仅用作二进制信号量,那么pthread互斥锁是一个完美的替代品。如果不是,您可以使用sem_open()来实现可移植性,也可以使用pthread互斥锁和条件变量编写一个模拟信号量的包装器。
答案 2 :(得分:1)
在给定的实例中,切换到互斥锁应该是安全的。如果一次只有一个线程可以进入给定的临界区,那么无论是否将其写为信号量,您实际上都有一个互斥锁。但是,根据操作系统的功能实现方式,您可能会获得不同的性能特征。这不是我会失去睡眠的东西,但在测试时仍然需要留在脑海中。