0
我需要一個不會阻塞線程的線程安全計數器。 (對於C11以前的工具。)在++/- 操作周圍鎖定互斥鎖可以阻止它。所以我想出了這個,使用信號量。這是否明智?Posix信號作爲線程安全計數器
#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以及任何普通的編譯器工作。
你知道原子操作是內置於95%的處理器,對吧?只需使用一些有針對性的內聯彙編。 –
當你告訴它減少時,你的櫃檯是否可以做_nothing_?嘗試等待可能會失敗。除此之外,它看起來不錯,但它不會超快。即使沒有C11,你也應該能夠使用原子增量/減量來犧牲一點便攜性(但是如果你添加2或3個ifdef,你幾乎可以覆蓋所有重要的體系結構)。 – Damon
找到一個支持大多數cpu類型的多平臺庫將是可愛的... – Liam