我需要一个不会阻塞线程的线程安全计数器。 (对于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,并与任何常见的编译器一起使用。
答案 0 :(得分:1)
我经常使用Golubenco & Sarbu描述的方法改编来解决这个问题。
这适用于gcc;我只在x84和amd64架构上试过这个。
基本上,你声明一些计数器宏,或者内联函数,如果是C ++,它们使用编译器提供的内部函数来进行安全的多线程/多核递增,递减和测试。
它没有完全纯粹的C ++语义,在我的用例中没问题,因为我在C和C ++之间共享代码,但是在你的类中加入它并不是很费劲。