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

时间:2016-04-19 20:54:55

标签: c++

class Semaphore
{
    private:
        static sem_t sem_id;
}

在cpp:

sem_init(&Semaphore::sem_id, 0, 0);
显然,编译器不允许我在函数之外运行代码。但它不是一种只能初始化为某种值的类型。我该怎么做?

2 个答案:

答案 0 :(得分:5)

你可以将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!)

(N.B。完全未经测试,但我想应该工作......)
(另外,不是类设计的最佳例子,但给出了要点。)

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

答案 1 :(得分:2)

只要在初始化程序中执行此操作,就可以从全局范围调用函数:

int unused_garbage = sem_init(&Semaphore::sem_id, 0, 0);

对于干净的破坏,您可以使用全局初始值设定项来注册at_exit处理程序,或者使用正确的RAII作为LRiO的答案演示。