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中运行结果如下:
以上代码在Visual Studio 2010中运行结果如下:
由此可见,使用原子操作,使第一个测试代码出现的错误消失。因此可以略微了解一些原子操作的作用。