我知道如何在C中使用Unix信号量。在使用它们之前,我必须调用一个名为sem_init
的构造函数-theh函数,在使用它们之后,我必须调用一个名为sem_destroy
的类似析构函数的函数。
我知道我可以继续在C ++中这样做,因为它与C的向后兼容性,但C ++是否有一种真正的面向对象的方式来使用信号量?
答案 0 :(得分:2)
你应该使用Boost libraries(如果你不了解它们,它们适用于C ++ JDK适用于Java的那些)。
Boost.Interprocess是您的问题所需的库。它提供了进程间通信机制的抽象。
This是如何使用信号量的示例。
答案 1 :(得分:2)
如果你真的坚持使用POSIX信号量而不是Boost,你当然可以在一个类中包装sem_t
:
class Semaphore {
sem_t sem;
public:
Semaphore(int shared, unsigned value)
{ sem_init(&sem, shared, value); }
~Semaphore() { sem_destroy(&sem); }
int wait() { return sem_wait(&sem); }
int try_wait() { return sem_trywait(&sem); }
int unlock() { return sem_post(&sem); }
};
为读者练习:您可能希望添加异常而不是C样式的错误代码以及其他功能。此外,此类应该是不可复制的。实现这一目标的最简单方法是继承boost::noncopyable
;)
修改:作为@Ringding备注,在EINTR
上循环将是一件非常明智的事情。
int Semaphore::wait()
{
int r;
do {
r = sem_wait(&sem);
} while (r == -1 && errno == EINTR);
return r;
}
答案 2 :(得分:0)