c++ - 在类中初始化静态 POSIX 信号量

标签 c++

class Semaphore
{
    private:
        static sem_t sem_id;
}

在 cpp 中:

sem_init(&Semaphore::sem_id, 0, 0);

显然,编译器不会让我在函数外运行代码。但它不是可以初始化为值的类型。我该怎么做?

最佳答案

您可以将 sem_id 包装在您自己的类中,该类在默认构造时执行 sem_init(在销毁时执行 sem_destroy;不要忘记那个!)。

遗憾的是,sem_t 不是一个类,因此您不能继承它,而必须组合它:

#include <semaphore.h>

class scoped_sem_t
{
public:
    scoped_sem_t() { sem_init(&sem, 0, 0); }
   ~scoped_sem_t() { sem_destroy(&sem); }

   sem_t& get() { return sem; }

private:
   sem_t sem;
};

class Semaphore
{
private:
   static scoped_sem_t impl;  // use Semaphore::impl.get()
};

scoped_sem_t Semaphore::impl;  // (don't forget this!)

(注意,完全未经测试,但我想它应该有效……)
(此外,这不是类设计的最佳示例,但为您提供了要点。)

否则,可悲的是,没有办法巧妙地做到这一点。您可以在 main 的开头编写 sem_init,但要注意不要从任何其他静态初始化程序引用 Semaphore::sem_id

关于c++ - 在类中初始化静态 POSIX 信号量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36729269/

相关文章:

c++ - 如何多次发送SIGINT信号

c++ - 在模板函数中将 Chars 转换为 Int

c++ - 访问 2D valarrays 的列切片

c++ - 是否可以确保模板类大小始终为 2 ^ N?

c++ - uint32_t 没有命名类型

c++ - 如何从 std::vector 搜索并返回项目

c++ - boost asio 打开更多的一个套接字

c++ - 多采样帧渲染对象和深度缓冲区

java - 内存分配究竟是如何进行的,Java 和 C 如何交互以跟踪同一个对象?

c++ - Visual C++ _snprintf 将 errno 设置为 ERANGE