多线程:InterlockedIncrement
1.InterlockedIncrement保护多线程中操作的整数。
#include <stdio.h> #include <windows.h> volatile long g_nLoginCount; //登录次数 unsigned int __stdcall Fun(void *pPM); //线程函数 const DWORD THREAD_NUM = 50;//启动线程数
DWORD WINAPI ThreadFun(void *pPM) { Sleep(100);//some work should to do //g_nLoginCount++; InterlockedIncrement((LPLONG)&g_nLoginCount); Sleep(50); return 0; }
int main() { printf(" 原子操作 Interlocked系列函数的使用\n"); printf(" -- by MoreWindows( http://blog.csdn.net/MoreWindows ) --\n\n"); //重复20次以便观察多线程访问同一资源时导致的冲突 int num= 20; while (num--) { g_nLoginCount = 0; int i; HANDLE handle[THREAD_NUM]; for (i = 0; i < THREAD_NUM; i++) handle[i] = CreateThread(NULL, 0, ThreadFun, NULL, 0, NULL); WaitForMultipleObjects(THREAD_NUM, handle, TRUE, INFINITE); printf("有%d个用户登录后记录结果是%d\n", THREAD_NUM, g_nLoginCount); } return 0; }
相关函数:
1.增减操作
LONG__cdeclInterlockedIncrement(LONG volatile* Addend);
LONG__cdeclInterlockedDecrement(LONG volatile* Addend);
返回变量执行增减操作之后的值。
LONG__cdec InterlockedExchangeAdd(LONG volatile* Addend, LONG Value);
返回运算后的值,注意!加个负数就是减。
2.赋值操作
LONG__cdeclInterlockedExchange(LONG volatile* Target, LONG Value);
Value就是新值,函数会返回原先的值。