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++,Src-shared)