临界区只有4个函数:
函数功能:初始化
void InitializeCriticalSection(LPCRITICAL_SECTIONlpCriticalSection);
函数说明:定义关键段变量后必须先初始化。
函数功能:销毁
void DeleteCriticalSection(LPCRITICAL_SECTIONlpCriticalSection);
函数说明:用完之后记得销毁。
函数功能:进入临界区
void EnterCriticalSection(LPCRITICAL_SECTIONlpCriticalSection);
函数说明:系统保证各线程互斥的进入临界区。
由于线程切换到等待状态开销较大,所以windows旋转让线程处于一个循环锁中循环,一段时间后才切换称等待。
函数功能:离开临界区
void LeaveCriticalSection(LPCRITICAL_SECTIONlpCriticalSection);
临界区可以用于线程间的互斥,但是不能用于同步,由于临界区是指进入 这个临界区后,线程才可以进行下一部操作,如果理解区中已有其他线程,则不可以进入新的线程,线程要等待临界区中已有线程离开。而主线程拥有对所有数据的访问权限,导致主线程可以在子线程之前修改参数。
CRITICAL_SECTION cs;
typedef struct param{
int a;
bool b;
double c;
string d;
};
unsigned int __stdcall threadfun1(LPVOID p){
Sleep(100);
EnterCriticalSection(&cs);
param* funparam = (param*) p;
cout<<"fun1 running:"<<funparam->d<<endl;
funparam->c *= funparam->a;
cout<<"ans:"<<funparam->c<<endl;
LeaveCriticalSection(&cs);
return 0;
}
DWORD __stdcall threadfun2(LPVOID p){
Sleep(100);
EnterCriticalSection(&cs);
param* funparam = (param*) p;
cout<<"fun2 running:"<<funparam->d<<endl;
funparam->c /= funparam->a;
cout<<"ans:"<<funparam->c<<endl;
LeaveCriticalSection(&cs);
return 0;
}
int main(){
param p={5,true,9.995,"hello world"};
InitializeCriticalSection(&cs);
HANDLE newthread1 = (HANDLE)_beginthreadex(NULL,0,threadfun1,&p,0,NULL);
HANDLE newthread2 = CreateThread(NULL,0,threadfun2,&p,0,NULL);
WaitForSingleObject(newthread2,INFINITE);
WaitForSingleObject(newthread1,INFINITE);
DeleteCriticalSection(&cs);
临界区实现的是互斥,临界区中有全部的系统资源的控制权,当一个线程进入临界区后,便获得了这些资源,设置一个临界区,通过临界区中只能有一个线程,使资源也只有一个线程在一个时刻可以访问,即互斥。
分享到:
相关推荐
vs2010C++多线程临界区小案例 简单明了,适合初学者,,,
使用该类可实现C++ 多线程日志的记录,创建了日志记录线程,使用日志等级、队列、信号量、临界区等方法实现记录,可在较高的实时性系统上完成日志记录。
C++11多线程编程.zip 代码实例 C++11多线程编程future其他成员函数、shared_future、atomic ...C++11多线程编程windows临界区、其他各种mutex互斥量 C++11多线程编程补充知识、线程池浅谈、数量谈、总结
Win32 SDK函数支持进行多线程的程序设计,并提供了操作系统原理中的各种同步、互斥和临界区等操作。Visual C++ 6.0中,使用MFC类库也实现了多线程的程序设计,使得多线程编程更加方便。 该教程提供了由浅入深的讲解...
多线程临界段同步演示1,用不同步和同步来对比多线程编程,直观深刻。采用API方式而非MFC类方式。
《C++面向对象多线程编程》共分13章,全面讲解构建多线程架构与增量多线程编程技术。第1章介绍了用于构建面向对象程序的不同类型C++组件,以及如何使用这些组件来构建多线程架构。第2、3、4章简要介绍进程、线程、多...
vc++中使用临界区CriticalSection的例子.zip
临界区的互斥控制_SetEvent置句柄为有信号状态配合WaitForSingleObject使用_INFINITE等待其运行结束
如题,包括如何实现一个互斥锁互斥锁和临界区锁
第6章详细讨论临界区、死锁、数据竞争以及无限延迟方面的主题。第7~10章讲解用于线程同步、线程间通信、进程间通信以及多线程处理的C++组件。第11章讨论C++对象在多线程环境中的行为和交互方式。第12章简单介绍多...
//使用多线程,定时器和map等编程技巧。 // 定义map对象来存储数据,主线程中定时向该对象插入数据,每次插入两个连续的数据插入后显示出当前map大小。 //第二个线程定时删除map中的数据,每次删除一个最前面的数据...
//文件介绍 1. computeThread 多线程处理数据 2. icpDialog 窗口类 3. icpThread 线程类 4. tb_basedata 线程间通信数据类型 5. Xmutex 临界区 以上所有功能的实现都使用C++类封装
那在Qt里面,由于Qt本身使用的是C++实现的,在支持C++的前提下,Qt还有自己创建多线程的方式,用得最多的主要有如下两种方式: 1、重写run函数来实现 2、使用moveToThread函数 参考帖子:...
c: 多线程访问同一资源 d: 经典线程同步互斥问题 e: 使用关键段解决子线程互斥问题 f: 利用事件实现线程同步问题 g: 利用互斥量来解决线程同步互斥问题 h: problem1 生产者消费者问题 (1生产者 1消费者 1...
使用事件和临界区实现的一对多锁,可用于一写多读、一读多写等一对多环境下多线程间的同步。使用事件和临界区实现,里面有具体的DEMO。 其中绘制信息使用了GDI和双缓存。
代码中的临界区变量(cs)就可以看作是变量s的锁,当函数EnterCriticalSection返回时,当前线程就获得了这把锁,之后就是对变量的访问了。访问完成后,调用LeaveCriticalSection表示释放这把锁,允许其他线程继续...
本文件夹收有自己在软件课程设计阶段做的几个小程序,有命令解释器、ping、客户服务器编程、软件实现临界区等,每个都比较短小精悍,对多线程和套接字编程的初学者极为有用
程序“使用线程复制文件”用临界区;来同步线程。 结果不理想,这次使用事件来同步线程。