`
阿尔萨斯
  • 浏览: 4110505 次
社区版块
存档分类
最新评论

c++ 多线程 临界区

 
阅读更多

临界区只有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);

临界区实现的是互斥,临界区中有全部的系统资源的控制权,当一个线程进入临界区后,便获得了这些资源,设置一个临界区,通过临界区中只能有一个线程,使资源也只有一个线程在一个时刻可以访问,即互斥。


分享到:
评论

相关推荐

    C++多线程临界区

    vs2010C++多线程临界区小案例 简单明了,适合初学者,,,

    C++ 多线程日志记录

    使用该类可实现C++ 多线程日志的记录,创建了日志记录线程,使用日志等级、队列、信号量、临界区等方法实现记录,可在较高的实时性系统上完成日志记录。

    C++11多线程编程.zip

    C++11多线程编程.zip 代码实例 C++11多线程编程future其他成员函数、shared_future、atomic ...C++11多线程编程windows临界区、其他各种mutex互斥量 C++11多线程编程补充知识、线程池浅谈、数量谈、总结

    C++多线程编程(教程+Demo)

    Win32 SDK函数支持进行多线程的程序设计,并提供了操作系统原理中的各种同步、互斥和临界区等操作。Visual C++ 6.0中,使用MFC类库也实现了多线程的程序设计,使得多线程编程更加方便。 该教程提供了由浅入深的讲解...

    多线程临界段同步演示1

    多线程临界段同步演示1,用不同步和同步来对比多线程编程,直观深刻。采用API方式而非MFC类方式。

    C++面向对象多线程编程

    《C++面向对象多线程编程》共分13章,全面讲解构建多线程架构与增量多线程编程技术。第1章介绍了用于构建面向对象程序的不同类型C++组件,以及如何使用这些组件来构建多线程架构。第2、3、4章简要介绍进程、线程、多...

    vc++中使用临界区CriticalSection来多线程互斥使用资源

    vc++中使用临界区CriticalSection的例子.zip

    c++使用临界区来互斥使用资源,比如多线程

    临界区的互斥控制_SetEvent置句柄为有信号状态配合WaitForSingleObject使用_INFINITE等待其运行结束

    多线程中互斥锁和临界区锁编码及特点

    如题,包括如何实现一个互斥锁互斥锁和临界区锁

    C++面向对象多线程编程(part2)

    第6章详细讨论临界区、死锁、数据竞争以及无限延迟方面的主题。第7~10章讲解用于线程同步、线程间通信、进程间通信以及多线程处理的C++组件。第11章讨论C++对象在多线程环境中的行为和交互方式。第12章简单介绍多...

    多线程map容器互斥代码

    //使用多线程,定时器和map等编程技巧。 // 定义map对象来存储数据,主线程中定时向该对象插入数据,每次插入两个连续的数据插入后显示出当前map大小。 //第二个线程定时删除map中的数据,每次删除一个最前面的数据...

    C++窗口+后台线程+多线程数据处理编程思想及源代码

    //文件介绍 1. computeThread 多线程处理数据 2. icpDialog 窗口类 3. icpThread 线程类 4. tb_basedata 线程间通信数据类型 5. Xmutex 临界区 以上所有功能的实现都使用C++类封装

    C++ Qt创建多线程的2种方式:重写run函数,使用moveToThread【应该早点知道的】源码示例

     那在Qt里面,由于Qt本身使用的是C++实现的,在支持C++的前提下,Qt还有自己创建多线程的方式,用得最多的主要有如下两种方式:  1、重写run函数来实现  2、使用moveToThread函数 参考帖子:...

    多线程代码 经典线程同步互斥问题 生产者消费者问题

    c: 多线程访问同一资源 d: 经典线程同步互斥问题 e: 使用关键段解决子线程互斥问题 f: 利用事件实现线程同步问题 g: 利用互斥量来解决线程同步互斥问题 h: problem1 生产者消费者问题 (1生产者 1消费者 1...

    一对多锁C++实现和DEMO

    使用事件和临界区实现的一对多锁,可用于一写多读、一读多写等一对多环境下多线程间的同步。使用事件和临界区实现,里面有具体的DEMO。 其中绘制信息使用了GDI和双缓存。

    c++线程加锁

    代码中的临界区变量(cs)就可以看作是变量s的锁,当函数EnterCriticalSection返回时,当前线程就获得了这把锁,之后就是对变量的访问了。访问完成后,调用LeaveCriticalSection表示释放这把锁,允许其他线程继续...

    多线程和套接字编程程序

    本文件夹收有自己在软件课程设计阶段做的几个小程序,有命令解释器、ping、客户服务器编程、软件实现临界区等,每个都比较短小精悍,对多线程和套接字编程的初学者极为有用

    使用线程复制文件的改进

    程序“使用线程复制文件”用临界区;来同步线程。 结果不理想,这次使用事件来同步线程。

Global site tag (gtag.js) - Google Analytics