Interlocked系列函数:
递增1操作:
LONG __cdecl InterlockedIncrement(LONG volatile *Addend);
递减1操作:
LONG __cdecl InterlockedDecrement(LONG volatile *Addend);
自定义步长递增/减操作:
LONG __cdecl InterlockedExchangeAdd(LONG volatile *Addend, LONG Value);
赋值操作:
LONG __cdecl InterlockedExchange(LONG volatile *Target, LONG Value);
#include <stdio.h>
#include <Windows.h>
#define THREAD_NUM 50
volatile long g_nLoginCount;
DWORD WINAPI ThreadFun(void *pM)
{
Sleep(100);
g_nLoginCount++;
Sleep(50);
return 0;
}
int main()
{
int num = 20;
int i;
HANDLE handle[THREAD_NUM];
printf("--------------------原子操作Interlocked--------------------\n");
while(num--)
{
g_nLoginCount = 0;
for(i = 0; i < THREAD_NUM; i++)
{
handle[i] = CreateThread(NULL, 0, ThreadFun, NULL, 0, NULL);
}
WaitForMultipleObjects(THREAD_NUM, handle, 1, INFINITE);
printf("有%d个用户登陆后记录结果是%d\n", THREAD_NUM, g_nLoginCount);
}
system("pause");
return 0;
}
以上代码在Visual Studio 2010中运行结果如下:
#include <stdio.h>
#include <Windows.h>
#define THREAD_NUM 50
volatile long g_nLoginCount;
DWORD WINAPI ThreadFun(void *pM)
{
Sleep(100);
InterlockedIncrement((LPLONG)&g_nLoginCount);
Sleep(50);
return 0;
}
int main()
{
int num = 20;
int i;
HANDLE handle[THREAD_NUM];
printf("--------------------原子操作Interlocked--------------------\n");
while(num--)
{
g_nLoginCount = 0;
for(i = 0; i < THREAD_NUM; i++)
{
handle[i] = CreateThread(NULL, 0, ThreadFun, NULL, 0, NULL);
}
WaitForMultipleObjects(THREAD_NUM, handle, 1, INFINITE);
printf("有%d个用户登录后记录结果是%d\n", THREAD_NUM, g_nLoginCount);
}
system("pause");
return 0;
}
以上代码在Visual Studio 2010中运行结果如下:
由此可见,使用原子操作,使第一个测试代码出现的错误消失。因此可以略微了解一些原子操作的作用。