windows进程同步和线程同步

来源:互联网 发布:算法导论 第一版pdf 编辑:程序博客网 时间:2024/05/17 07:44

Windows共设置了4种主要的同步对象,分别是临界区(Critical Section)、互斥量(Mutex)、信号量(Semaphore)和事件(Event)。MFC封装了它们,分别是类CCriticalSection、CMutex、CSemaphore和CEvent,它们都以CSyncObject为基类。

任何一种方式都可以用在线程同步上,但是CCriticalSection不能应用在进程同步上,因为CriticalSection是进程的一种资源。

1、临界区
(1)创建:CCriticalSection myCriticalSection;
(2)对临界区加锁:myCriticalSection.Lock();
(3)解锁:myCriticalSection.UnLock();


2、互斥对象
它不仅可以在同一进程的线程之间实现资源的安全共享,而且可以在不用进程的线程之间实现资源的安全共享。
(1)创建:CMutex myMutex;
(2)创建一个CSingleLock对象:CSingleLock singleLock(&myMutex);
(3)得到Mutex对象:singleLock.Lock();
(4)如果其他线程已经拥有了该Mutex对象,那么系统会把该线程挂起来。
(5)释放:singleLock.UnLock();


3、信号量对象
允许多个线程同时访问一个受保护的资源。
(1)创建:CSemaphore myCSemaphore;
CSemaphore=new CSemaphore(5,5);
其中第一个参数为计数器的初始值,第二个参数为计数器的最大值。
(2)使用:CSingleLock singleLock(&myCSemaphore);
(3)减少CSemaphore对象的计数值:singleLock.Lock();
(4)释放CSemaphore对象:singleLock.UnLock();


4、事件对象(Event)
Event对象由CEvent类创建。一个Event对象可以有两种状态:有信号状态和无信号状态。线程通过检测Event对象的状态进行相应的处理。
(1)创建:CEvent StartThread;
(2)创建完之后,Event对象自动处于无信号状态,要给Event对象发送信号:StartThread.SetEvent();
(3)线程通过以下函数来检测事件的信号:
::waitForSingleObject(StartThread.m_hObject,INFINITE);
此函数的两个参数分别是要检测的Event对象的句柄(在该Event对象的m_hObject成员变量中)和等待该信号准备花的时间,INFINITE表示无时间限制即无限期的等待。 

原创粉丝点击