17-2线程同步
Windows支持4中类型的同步对象,可以用过来同步由并发运行的线程执行的操作:
临界区
互斥量
事件
信号量
MFC在名为CCriticalSection\CMutex\CEvent和CSemaphore的类中封装了这些对象。MFC还包含了名为CSingleLock和CMultiLock的一对类。
17.2.1临界区
最简单类型的线程同步对象就是临界区。临界区用来串行化对两个或多个线程公用的链表、简单变量、结构和其他资源的访问、这些线程必须属于相同的进程。因为临界区是不能跨越进程的边界工作。
临界区背后的思想就是,每个对战型第访问一个资源的线程可以在访问那个资源之前锁定临界区,网文完成之后接触锁定。如果线程B师徒锁定当前有线程A锁定的临界区,线程B将阻塞知道该临界区空闲。
阻塞是,线程B出在一个十分有效的等待状态等待,他不消耗处理器时间。
CCriticalSection::Lock锁定临界区,而CCriticalSection::Unlock接触对临界区的锁定。
1 //Global data 2 CCriticalSection g_cs; 3 . 4 . 5 . 6 //Thread A 7 g_cs.Lock(); 8 //Write to the linked list. 9 g_cs.Unlock(); 10 . 11 . 12 . 13 //Thread B 14 g_cs.Lock(); 15 //Read from the linked list. 16 g_cs.Unlock();
17.2.2互斥量
与临界区不同的是,互斥量可以用来同步在相同进程或者不同进程上运行的线程。
1 //Global data 2 CMutex g_mutex(FALSE,_T("MyMutex")); 3 . 4 . 5 . 6 g_mutex.Lock(); 7 //Read or write the linked list. 8 g_mutex.Unlock();