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

发布于 2024-10-14 12:06:19 字数 208 浏览 5 评论 0原文

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

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

I know how to use Unix semaphores in C. Before using them I must call a constructor-ish function named sem_init and after using them I have to call a destructor-like function named sem_destroy.

I know I can keep doing this in C++ because of its backwards compatibility with C, but does C++ have a real object-oriented way to use semaphores?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

若言繁花未落 2024-10-21 12:06:19

如果您确实坚持使用 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;
}

If you really insist on using POSIX semaphores and not Boost, you can of course wrap sem_t in a class:

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); }
};

Exercise for the reader: You may want to add exceptions instead of C-style error codes and perhaps other features. Also, this class should be noncopyable. The easiest way to achieve that is inheriting from boost::noncopyable ;)

Edit: as @Ringding remarks, looping on EINTR would be a very wise thing to do.

int Semaphore::wait()
{
    int r;
    do {
        r = sem_wait(&sem);
    } while (r == -1 && errno == EINTR);
    return r;
}
不…忘初心 2024-10-21 12:06:19

您应该使用 Boost 库(如果您不知道它们,它们对于 C++ 的作用就像 JDK 对于 Java 的作用一样) )。

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

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

You should use the Boost libraries (if you don't know them, they are for C++ what the JDK is for Java).

Boost.Interprocess is the library you need for your question. It provides an abstraction over the inter-process communnication mechanisms.

This is an example of how to use semaphores.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文