Posix信号量作为线程安全计数器

时间:2014-02-27 00:41:07

标签: c++ multithreading

我需要一个不会阻塞线程的线程安全计数器。 (对于C11之前的工具。)在++ / - 周围锁定互斥锁可以阻止它。所以我想出了这个,使用信号量。这是明智的吗?

#include <semaphore.h>

class AtomicCounter {
public:
  AtomicCounter(unsigned int i=0) { sem_init(&m, 0, i); }
  ~AtomicCounter() { sem_destroy(&m); }

  operator unsigned int() { int a; sem_getvalue(&m, &a); return a; }
  AtomicCounter& operator++() { sem_post(&m); return *this; }
  AtomicCounter& operator--() { sem_trywait(&m); return *this; }

private:
  AtomicCounter(const AtomicCounter&);
  AtomicCounter& operator=(const AtomicCounter&);
  sem_t m;
};

修改 另一种方法是需要支持ARMv7和x86,并与任何常见的编译器一起使用。

1 个答案:

答案 0 :(得分:1)

我经常使用Golubenco & Sarbu描述的方法改编来解决这个问题。

这适用于gcc;我只在x84和amd64架构上试过这个。

基本上,你声明一些计数器宏,或者内联函数,如果是C ++,它们使用编译器提供的内部函数来进行安全的多线程/多核递增,递减和测试。

它没有完全纯粹的C ++语义,在我的用例中没问题,因为我在C和C ++之间共享代码,但是在你的类中加入它并不是很费劲。