C/C++|C/C++ nvm::threading::Interlocked class -- shared

usage

/* usage */ #include #include "nvm.h" #include "threading/Interlocked.h"static nvm::Int32 g_globalAutoIncrnum = 0; using nvm::threading::Interlocked; int main(int argc, char* argv[]) { if (!Interlocked::CompareExchange(g_globalAutoIncrnum, 1, 0)) { printf("localTaken=true\n"); } else { printf("localTaken=false\n"); } printf("Rd-signal=%02d\n", Interlocked::Read(g_globalAutoIncrnum)); return 0; }

Interlocked.h
#ifndef INTERLOCKED_H #define INTERLOCKED_H#include "../nvm.h"namespace nvm { namespace threading { class Interlocked // static class { public: static nvm::Int32 Increment(volatile nvm::Int32& location); static nvm::Int64 Increment(volatile nvm::Int64& location); static nvm::Int32 Decrement(volatile nvm::Int32& location); static nvm::Int64 Decrement(volatile nvm::Int64& location); static nvm::Int32 Exchange(volatile nvm::Int32& location1, nvm::Int32 value); static nvm::Int64 Exchange(volatile nvm::Int64& location1, nvm::Int64 value); static nvm::Int32 CompareExchange(volatile nvm::Int32& location1, nvm::Int32 value, nvm::Int32 comparand); static nvm::Int64 CompareExchange(volatile nvm::Int64& location1, nvm::Int64 value, nvm::Int64 comparand); static nvm::Int32 Read(volatile nvm::Int32& location); static nvm::Int64 Read(volatile nvm::Int64& location); static nvm::Int32 Add(volatile nvm::Int32& location1, nvm::Int32 value); static nvm::Int64 Add(volatile nvm::Int64& location1, nvm::Int64 value); }; } } #endif

Interlocked.cpp
#include "Interlocked.h"#include #include #include namespace nvm { namespace threading { nvm::Int32 Interlocked::Increment(volatile nvm::Int32& location) { return (nvm::Int32)InterlockedIncrement((LONG*)&location); } nvm::Int64 Interlocked::Increment(volatile nvm::Int64& location) { return (nvm::Int64)InterlockedIncrement((unsigned long long*)&location); } nvm::Int32 Interlocked::Decrement(volatile nvm::Int32& location) { return (nvm::Int32)InterlockedDecrement((LONG*)&location); } nvm::Int64 Interlocked::Decrement(volatile nvm::Int64& location) { return (nvm::Int64)InterlockedDecrement((unsigned long long*)&location); } nvm::Int32 Interlocked::Exchange(volatile nvm::Int32& location1, nvm::Int32 value) { return (nvm::Int64)InterlockedExchange((LONG*)&location1, (LONG)value); } nvm::Int64 Interlocked::Exchange(volatile nvm::Int64& location1, nvm::Int64 value) { return (nvm::Int64)InterlockedExchange((unsigned long long*)&location1, (unsigned long long)value); } nvm::Int32 Interlocked::CompareExchange(volatile nvm::Int32& location1, nvm::Int32 value, nvm::Int32 comparand) { return (nvm::Int32)InterlockedCompareExchange((LONG*)&location1, (LONG)value, (LONG)comparand); } nvm::Int64 Interlocked::CompareExchange(volatile nvm::Int64& location1, nvm::Int64 value, nvm::Int64 comparand) { return (nvm::Int64)InterlockedCompareExchange((unsigned long long*)&location1, (unsigned long long)value, (unsigned long long)comparand); } nvm::Int32 Interlocked::Read(volatile nvm::Int32& location) { return Interlocked::CompareExchange(location, 0, 0); } nvm::Int64 Interlocked::Read(volatile nvm::Int64& location) { return Interlocked::CompareExchange(location, 0, 0); } nvm::Int32 Interlocked::Add(volatile nvm::Int32& location1, nvm::Int32 value) { return (nvm::Int64)InterlockedExchangeAdd((LONG*)&location1, (LONG)value); } nvm::Int64 Interlocked::Add(volatile nvm::Int64& location1, nvm::Int64 value) { return (nvm::Int64)InterlockedExchangeAdd64((LONG64*)&location1, (LONG64)value); } } }

【C/C++|C/C++ nvm::threading::Interlocked class -- shared】

    推荐阅读