usage
/*
usage
*/
#include <stdio.h>
#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 <stdlib.h>
#include <intrin.h>
#include <Windows.h>
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);
}
}
}