windows线程同步-原子操作-Interlocked系列函数(用户模式)
2012-11-02 00:18
549 查看
Interlocked系列函数用来保证原子访问。
InterlockedExchangeAdd提供保证long类型的原子操作。
InterlockedExchangeAdd64提供long long 64位的原子操作。
搞不懂为什么不提供int类型的,int类型转换成long类型就是2个不同内存地址的变量,
再来对long类型进行原子操作也就没用了?
(这里请教了下c++网友,说是vs2010对类型检查很严格,可能之前的编译器也许会放松点?)
int类型要进行原子操作只能强转为long指针了
static int l=0;
unsigned __stdcall ThreadFun(void* par)
{
//注意这里的强转,不会改变内存地址导致原子操作无效
InterlockedExchangeAdd((long*)&l,1);
return 0;
}
上面几个函数返回由加数指向的变量的初始值,
long i=0;
cout<<InterlockedExchangeAdd(&i,1)<<endl;//输出0
cout<<InterlockedExchangeAdd(&i,1)<<endl;//输出1
书上提到Interlocked速度很快,这点不错,C#中经常用相应的函数,而且不需要在用户模型和内核模式之前切换
另外提到的一个重要点,原子操作的变量必须是内存对齐的。
上面的是对变量进行原子增加,下面的几个函数是讲参数变为指定的值(原子操作)。
InterlockedExchange
InterlockedExchange64
InterlockedExchangePointer//如果应用程序是32位,那么这里替换的就是32位,64位程序则对应
用InterlockedExchange实现旋转锁
windows核心编程提到,旋转锁很费cpu,这里把Sleep时间设置长点就不浪费了吧,但是却不能及时抢到资源所有权。
旋转锁貌似就是实现了对代码块的锁定,假如我们没有使用c#中lock等锁定代码块的,或者也没用底层的CRITICAL_SECTION,那么要锁定代码块貌似我知道的就旋转锁。
Interlocked系列函数还剩下下面2个,功能是以原子操作方式进行对比和设置。具体查询msdn。
InterlockedCompareExchange
InterlockedCompareExchangePointer
本文版权归kennyMc和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
InterlockedExchangeAdd提供保证long类型的原子操作。
InterlockedExchangeAdd64提供long long 64位的原子操作。
搞不懂为什么不提供int类型的,int类型转换成long类型就是2个不同内存地址的变量,
再来对long类型进行原子操作也就没用了?
(这里请教了下c++网友,说是vs2010对类型检查很严格,可能之前的编译器也许会放松点?)
int类型要进行原子操作只能强转为long指针了
static int l=0;
unsigned __stdcall ThreadFun(void* par)
{
//注意这里的强转,不会改变内存地址导致原子操作无效
InterlockedExchangeAdd((long*)&l,1);
return 0;
}
#include <iostream> #include <process.h> #include <windows.h> using namespace std; static long l=0; unsigned __stdcall ThreadFun(void* par) { InterlockedExchangeAdd(&l,1); return 0; } int main() { HANDLE hThread[2]; hThread[0]=(HANDLE)_beginthreadex(NULL,0,&ThreadFun,NULL,0,NULL); hThread[1]=(HANDLE)_beginthreadex(NULL,0,&ThreadFun,NULL,0,NULL); //等待所有线程结束 WaitForMultipleObjects(2,hThread,true,INFINITE); CloseHandle(hThread[0]); CloseHandle(hThread[1]); //就算没有进行原子操作,测试的时候基本上还是输出2,极少输出1,变量++是秒杀完成的。 //在实际项目的大并发情况下那么结果是1就很容易出现 cout<<"l="<<l<<endl; system("PAUSE"); return 0; }
上面几个函数返回由加数指向的变量的初始值,
long i=0;
cout<<InterlockedExchangeAdd(&i,1)<<endl;//输出0
cout<<InterlockedExchangeAdd(&i,1)<<endl;//输出1
书上提到Interlocked速度很快,这点不错,C#中经常用相应的函数,而且不需要在用户模型和内核模式之前切换
另外提到的一个重要点,原子操作的变量必须是内存对齐的。
上面的是对变量进行原子增加,下面的几个函数是讲参数变为指定的值(原子操作)。
InterlockedExchange
InterlockedExchange64
InterlockedExchangePointer//如果应用程序是32位,那么这里替换的就是32位,64位程序则对应
用InterlockedExchange实现旋转锁
#include <iostream> #include <process.h> #include <windows.h> using namespace std; BOOL b=FALSE; unsigned __stdcall ThreadFun(void* par) { int* pout=(int*)par; while(InterlockedExchange((unsigned long*)&b,TRUE)==TRUE) { Sleep(500); } for(int i=0;i<3;i++) { Sleep(1000); cout<<*pout<<endl; } InterlockedExchange((unsigned long*)&b,FALSE); return 0; } int main() { HANDLE hThread[2]; int a1=1; int a2=2; hThread[0]=(HANDLE)_beginthreadex(NULL,0,&ThreadFun,&a1,0,NULL); hThread[1]=(HANDLE)_beginthreadex(NULL,0,&ThreadFun,&a2,0,NULL); //等待所有线程结束 WaitForMultipleObjects(2,hThread,true,INFINITE); CloseHandle(hThread[0]); CloseHandle(hThread[1]); system("PAUSE"); return 0; }
windows核心编程提到,旋转锁很费cpu,这里把Sleep时间设置长点就不浪费了吧,但是却不能及时抢到资源所有权。
旋转锁貌似就是实现了对代码块的锁定,假如我们没有使用c#中lock等锁定代码块的,或者也没用底层的CRITICAL_SECTION,那么要锁定代码块貌似我知道的就旋转锁。
Interlocked系列函数还剩下下面2个,功能是以原子操作方式进行对比和设置。具体查询msdn。
InterlockedCompareExchange
InterlockedCompareExchangePointer
本文版权归kennyMc和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
相关文章推荐
- Windows Via C/C++:用户模式下的线程同步——原子操作:Interlocked函数族
- 第8章 用户模式下的线程同步(1)_Interlocked系列函数
- Windows线程(三)原子操作Interlocked系列函数
- 【windows多线程】原子操作 Interlocked系列函数
- Windows Via C/C++:用户模式下的线程同步——原子操作:Interlocked函数族
- 秒杀多线程第三篇 原子操作 Interlocked系列函数
- 秒杀多线程第三篇 原子操作 Interlocked系列函数 .
- 秒杀多线程第三篇 原子操作 Interlocked系列函数
- 秒杀多线程第三篇 原子操作 Interlocked系列函数
- 【转】秒杀多线程第三篇 原子操作 Interlocked系列函数
- 秒杀多线程第三篇 原子操作 Interlocked系列函数
- 秒杀多线程第三篇 原子操作 Interlocked系列函数
- 多线程同步 -原子操作 (Interlocked系列函数)
- 秒杀多线程第三篇 原子操作 Interlocked系列函数
- 秒杀多线程第三篇 原子操作 Interlocked系列函数
- 6.[个人]C++线程入门到进阶(6)----原子操作 Interlocked系列函数
- 秒杀多线程第三篇 原子操作 Interlocked系列函数
- 秒杀多线程-原子操作Interlocked系列函数
- 多线程笔记--原子操作Interlocked系列函数
- 秒杀多线程第三篇---原子操作 Interlocked系列函数