MFC线程同步

原创 2012年03月24日 21:13:49

一.事件

可以使用CEvent对象发出通知信号,通知系统是否可以运行等待线程

假设有三个线程Thread1,Thread2,Thread3,一个全局的CEvent 对象oEvent

CEvent oEvent();//等待于(CEvent oEvent(FALSE,FALSE),即(禁止发信,非手动[自动事件])


 线程函数定义如下:

UINT Thread1(LPVOID pParam)
{
    ......
    oEvent.Lock();
    ......
}

UINT Thread2(LPVOID pParam)
{
    ......
    oEvent.Lock();
    ......
}

UINT Thread3(LPVOID pParam)
{
    ......
    oEvent.SetEvent();
    ......
}

假设调用过程为:

	AfxBeginThread(Thread1,"Thread1 start");
	AfxBeginThread(Thread2,"Thread2 start");

这样就启动了两个线程,不过都执行到oEvent.Lock()的时候就停止了运行(可以理解为线程入栈).因为此时的oEvent.bInitiallyOwn=FALSE,即禁止发信

这里再启动Thread3,执行到oEvent.SetEvent()的时候,oEvent.binitiallyOwn=TRUE;此时系统发出一个信号通知阻塞的线程,通知的顺序按先进后出的顺序(线程出栈),如上的例子就是先是Thread2被唤醒,Thread2被唤醒之后,马上就将OEvent.bInitiallyOwn的值设置为FALSE,这是CEvent的构造函数第二个参数的意义,自动停止发信.


假如CEvent oEvent(FALSE,TRUE),即创建了一个手动事件对象,与上边自动不同的是,在调用 SetEvent()的时候会将所以线程栈当中的阻塞线程一次过唤醒而不停止.


二.临界段

临界是一个公共的资源,当有一个线程希望获取(主要是修改)临界资源的时候,应该先向系统申请,先建立一个对象:

	CCriticalSection criticalSection;

在需要访问临界的线程前加上资源锁:

	criticalSection.Lock();
如果资源没有被其他线程用(锁),就获取资源,否则就阻塞.

当这个线程用完资源后,要用

	criticalSection.UnLock();
来解除资源锁定,否则其他以后都不能再访问到临界资源

三.互斥体

基本与临界一样,只不过临界限定的范围在本进程内,而互斥在不同进程之间都可以互斥

     声明:

	CMutex mutexObj(FALSE,"mutex1");//(初始是否锁定,互斥名)
	mutexObj.Lock();
	mutexObj.UnLock();

三.信号量

信号量就是限制进程同一时间对共享资源同时访问的线程数上限,其他跟临界一样.

	CSemaphore semaphorObj(2,3);//(计数器初始值,计数器最大值)
	semaphorObj.Lock();//计数器减一,如果为0,则线程阻塞
	semaphorObj.Unlock();//计数器加一





MFC线程同步那些事

讲述线程运行及退出时遇到的一些问题和解决办法以及注意事项。一个工业控制项目,用USB口采集数据,程序结构是主进程负责界面和算法,创建一个子线程负责USB通讯,读取数据,死循环。...
  • hhhh63
  • hhhh63
  • 2016年12月06日 18:17
  • 173

线程同步的方法 MFC

线程同步互斥的控制方法 四种进程或线程同步互斥的控制方法     1、临界区:通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问。    2、互斥量:为协调共同对...

MFC 多线程及线程同步

一、MFC对多线程编程的支持   MFC中有两类线程,分别称之为工作者线程和用户界面线程。二者的主要区别在于工作者线程没有消息循环,而用户界面线程有自己的消息队列和消息循环。   工作者线程没有消息...

VC++ MFC 多线程及线程同步

使线程同步   在程序中使用多线程时,一般很少有多个线程能在其生命期内进行完全独立的操作。更多的情况是一些线程进行某些处理操作,而其他的线程必须对其处理结果进行了解。正常情况下对这种处理结果的了...

MFC 多线程及线程同步

一、MFC对多线程编程的支持   MFC中有两类线程,分别称之为工作者线程和用户界面线程。二者的主要区别在于工作者线程没有消息循环,而用户界面线程有自己的消息队列和消息循环。   工作者线程没有消...
  • whatday
  • whatday
  • 2012年06月15日 16:16
  • 891

VC++ MFC 多线程及线程同步

使线程同步   在程序中使用多线程时,一般很少有多个线程能在其生命期内进行完全独立的操作。更多的情况是一些线程进行某些处理操作,而其他的线程必须对其处理结果进行了解。正常情况下对这种处理结果的了解应...

MFC 多线程及线程同步

一、MFC对多线程编程的支持   MFC中有两类线程,分别称之为工作者线程和用户界面线程。二者的主要区别在于工作者线程没有消息循环,而用户界面线程有自己的消息队列和消息循环。   工作者线程没有消息...

MFC多线程与线程同步 (三)

3.信号量内核对象   信号量(Semaphore)内核对象对线程的同步方式与前面几种方法不同,它允许多个线程在同一时刻访问同一资源,但是需要限制在同一时刻访问此资源的最大线程数目。在用Create...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:MFC线程同步
举报原因:
原因补充:

(最多只允许输入30个字)