我需要一个不会阻塞线程的线程安全计数器。 (对于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 ++之间共享了代码,但是并不需要花费很多精力来将它集成到您的类中。