Monday, January 18, 2010

SHM ConcurrentCounter



Fast concurrent counter for 2 threads:


struct ConcurrentCounter {

private: // shm data

unsigned long mCounter_byFirstThread;
char CPU_CACHE_GUARD[PAD_SIZE];
unsigned long mCounter_bySecondThread;

public: // interface for first thread

inline void increment_byFirstThread() { mCounter_byFirstThread++; }
inline void decrement_byFirstThread() { mCounter_byFirstThread--; }

public: // interface for second thread

inline void increment_bySecondThread() { mCounter_bySecondThread++; }
inline void decrement_bySecondThread() { mCounter_bySecondThread--; }

public: // concurrent interface

inline unsigned long getCounter_safe() {
return (mCounter_byFirstThread + mCounter_bySecondThread);
}

public: // init interface

void initCounter_unsafe(unsigned long aValue = 0) {
mCounter_byFirstThread = 0;
mCounter_bySecondThread = 0;
if (0 == aValue) return;
mCounter_byFirstThread = aValue / 2;
mCounter_bySecondThread = aValue - mCounter_byFirstThread;
}

} __attribute__((__packed__));







%%

No comments: