C ++中面向对象的信号量使用

时间:2011-01-26 11:13:33

标签: c++ multithreading unix semaphore

我知道如何在C中使用Unix信号量。在使用它们之前,我必须调用一个名为sem_init的构造函数-theh函数,在使用它们之后,我必须调用一个名为sem_destroy的类似析构函数的函数。

我知道我可以继续在C ++中这样做,因为它与C的向后兼容性,但C ++是否有一种真正的面向对象的方式来使用信号量?

3 个答案:

答案 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)