标签:多线程 c++ interlocked
上一篇中我们出现了脏读的问题,但是却没有给出解决办法这一篇中我们这一篇中主要说明一下interlocked系列函数。
下面列出一些常用的Interlocked系列函数:
1.增减操作
LONG__cdeclInterlockedIncrement(LONG volatile* Addend);
LONG__cdeclInterlockedDecrement(LONG volatile* Addend);
返回变量执行增减操作之后的值。
LONG__cdec InterlockedExchangeAdd(LONG volatile* Addend, LONGValue);
返回运算后的值,(注意)加个负数就是减。
2.赋值操作
LONG__cdeclInterlockedExchange(LONG volatile* Target, LONGValue);
Value就是新值,函数会返回原先的值。
在本例中只要使用InterlockedIncrement()函数就可以了。下面我们列一下代码。
<span style="font-size:14px;"> #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; } </span>
多线程面试秒杀系列4---Interlocked系列函数的简要分析
标签:多线程 c++ interlocked
原文地址:http://blog.csdn.net/djd1234567/article/details/46011455