我需要一个不会阻塞线程的线程安全计数器。 (对于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并与任何常见的编译器一起使用。

最佳答案

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

这适用于gcc;我只在x84和amd64体系结构上进行过尝试。

本质上,您声明了一些计数器宏,或者使用C ++的内联函数,这些宏使用编译器提供的内在函数来进行安全的多线程/多核递增,递减和测试。

它没有完全的C ++语义,这在我的用例中还可以,因为我在C和C ++之间共享了代码,但是并不需要花费很多精力来将它集成到您​​的类中。

10-08 01:17