【问题标题】:Object-oriented semaphore usage in C++C++中面向对象的信号量使用
【发布时间】:2011-06-15 18:58:18
【问题描述】:

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

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

【问题讨论】:

  • 我以前听说过Boost,但没用过。你是说如果我想以 OO 方式使用信号量,我需要下载额外的库吗?然后我会坚持使用已经包含的semaphore.h 库。

标签: c++ multithreading unix semaphore


【解决方案1】:

如果你真的坚持使用 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;
}

【讨论】:

  • 您应该在调用 sem_wait 时检查 EINTR 并相应地循环。
【解决方案2】:

您应该使用Boost libraries(如果您不知道它们,它们用于 C++,就像 JDK 用于 Java)。

Boost.Interprocess 是您的问题所需的库。它提供了对进程间通信机制的抽象。

This 是一个如何使用信号量的示例。

【讨论】:

    【解决方案3】:
    猜你喜欢
    • 2013-05-23
    • 2014-04-17
    • 1970-01-01
    • 1970-01-01
    • 2021-08-09
    • 1970-01-01
    • 2017-08-09
    • 1970-01-01
    • 2011-10-01
    相关资源
    最近更新 更多