<b>Win32下两种用于C++的线程同步类(上)</b>[VC/C++编程]
本文“<b>Win32下两种用于C++的线程同步类(上)</b>[VC/C++编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
线程同步是多线程程序计划的核心内容,它的目的是精确处理多线程并发时的各种问题,比方线程的等候、多个线程拜候同一数据时的互斥,防死锁等.Win32供应多种内查对象和手段用于线程同步,如互斥量、信号量、事件、临界区等.所差别的是,互斥量、信号量、事件都是Windows的内查对象,当程序对这些对象举行掌握时会自动转换到核心态,而临界区本身不是内查对象,它是工作在用户态的.我们知道从用户态转换到核心态是需求以时间为代价的,所以假如能在用户态就简单办理的问题,便可以没必要劳烦核心态了.
这里我要说的是两种用于C++的多线程同步类,通过对这两种类的利用便可以便利的实现对变量或代码段的加锁掌握,从而避免多线程对变量不精确的操作.
所谓加锁,就是说当我们要拜候某关键变量之前,都需求首先得到答应才能持续,假如未得到答应则只有等候.一个关键变量拥有一把锁,一个线程必须先得到这把锁(其实称为钥匙大概更形象)才可以拜候这个变量,而当某个变量持有这把锁的时刻,其他线程就不能反复的得到它,只有等持有锁的线程把锁偿还今后其他线程才有大概得到它.之所以这样做,就是为了避免一个线程读取某对象途中另一线程对它举行了改正,或两线程同时对一变量举行改正,比方:
// 全局:
struct MyStruct ... { int a, b; } ;
MyStruct s;
// 线程1:
int a = s.a;
int b = s.b;
// 线程2:
s.a ++ ;
s.b -- ;
假照实际的履行次序就是上述书写的次序那到没有什么,但假如线程2的履行打断了线程1,变成以下次序:
int a = s.a; //线程1
s.a++; //线程2
s.b++; //线程2
int b = s.b; //线程1
那么这时线程1读出来的a和b就会有问题了,因为a是在改正前读的,而b是在改正后读的,这样读出来的是不完好的数据,会对程序带来不可意料的后果.天知道两个程的调度次序是什么样的.为了避免这种情形的呈现,需求对变量s加锁,也就是当线程1得到锁今后便可以安心的拜候s,这时假如线程2要改正s,只有等线程1拜候完成今后将锁释放才可以,从而保证了上述两线程穿插拜候变量的情形不会呈现.
以上是“<b>Win32下两种用于C++的线程同步类(上)</b>[VC/C++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |