2014-02-27 56 views
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以及任何普通的編譯器工作。

+0

你知道原子操作是內置於95%的處理器,對吧?只需使用一些有針對性的內聯彙編。 –

+0

當你告訴它減少時,你的櫃檯是否可以做_nothing_?嘗試等待可能會失敗。除此之外,它看起來不錯,但它不會超快。即使沒有C11,你也應該能夠使用原子增量/減量來犧牲一點便攜性(但是如果你添加2或3個ifdef,你幾乎可以覆蓋所有重要的體系結構)。 – Damon

+0

找到一個支持大多數cpu類型的多平臺庫將是可愛的... – Liam

回答

1

我經常使用由Golubenco & Sarbu描述的方法的一個適應來解決這個問題。

這適用於gcc;我只在x84和amd64架構上嘗試過。

本質上講,你聲明一些計數器宏或內聯函數,如果C++,使用提供了安全的多線程/多核心遞增,遞減和測試內部函數編譯器。

它並不完全具有純粹的C++語義,這在我的用例中是確定的,因爲我在C和C++之間共享了代碼,但將其併入您的類中並不是很多努力。