Windows线程(三)原子操作Interlocked系列函数

xiaoxiao2021-02-28  46

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中运行结果如下:

由此可见,使用原子操作,使第一个测试代码出现的错误消失。因此可以略微了解一些原子操作的作用。

转载请注明原文地址: https://www.6miu.com/read-2612694.html

最新回复(0)