接上一篇(http://www.youranshare.com/blog/sid/38.html),线程的同步一般使用了4种方式,互斥(CMutex)、临界(CriticalSection)、信号量(Semaphore)、事件(Event),上一篇中已经写了一个CMutex的示例代码,剩下的3种与之类似,都是创建、加锁、释放锁定。
所以在本文中就简单的介绍了剩下的三种的使用方法:
· 临界(CriticalSection)
① Win32中的使用:
// 临界区结构对象 CRITICAL_SECTION hCritical; // 共享资源 char iArray[10]; UINT ThreadProc10(LPVOID pParam) { // 进入临界区 EnterCriticalSection(&hCritical); // 对共享资源进行写入操作 for (int i = 0; i < 10; i++) { iArray = a; Sleep(1); } // 离开临界区 LeaveCriticalSection(&hCritical); return 0; } UINT ThreadProc11(LPVOID pParam) { // 进入临界区 EnterCriticalSection(&hCritical); // 对共享资源进行写入操作 for (int i = 0; i < 10; i++) { iArray[10 - i - 1] = b; Sleep(1); } // 离开临界区 LeaveCriticalSection(&hCritical); return 0; } void CSample08View::OnCriticalSection() { // 初始化临界区 InitializeCriticalSection(&hCritical); // 启动线程 AfxBeginThread(ThreadProc10, NULL); AfxBeginThread(ThreadProc11, NULL); // 等待计算完毕 Sleep(300); // 报告计算结果 CString sResult = CString(iArray); AfxMessageBox(sResult); }
② MFC中的临界区使用:
//临界对象 CCriticalSection criticalSection; UINT MessageThread1(LPVOID pParam) { //锁定 criticalSection.Lock(); //你的操作......... //...... //释放 criticalSection.Unlock(); return 0; } UINT MessageThread2(LPVOID pParam) { //锁定 criticalSection.Lock(); //你的操作......... //...... //释放 criticalSection.Unlock(); return 0; } //创建开启线程 void CThreadTestView::OnLButtonDown(UINT nFlags, CPoint point) { AfxBeginThread(MessageThread1, _T("Thread is started")); //启动线程1 AfxBeginThread(MessageThread2, _T("Thread is started")); //启动线程2 }
· 信号量(Semaphore)
① Win32下的使用:
//这个东东跟win32的互斥体使用是一样的 HANDLE hSe; //初始化的时候使用这个函数 hSe = CreateSemaphore(NULL,1,1,NULL); //等待 WaitForSingleObject(hSe,INFNITE); //释放 ReleaseSemaphore(hSe,1,NULL); ② MFC下使用信号量: //同样,和互斥体的使用一样 CSemaphore cSemap; //锁定 cSemap.Lock(); //解锁 cSemap.Unlock();
· 事件(Event)
① Win32下的使用:
//依然类似 互斥体,只有创建释放的时候有所不同 HANDLE hEve=NULL; //创建一个事件 hEve = CreateEvent(NULL,FALSE,FALSE,NULL); SetEvent(hEve); //等待 WaitForSingleObject(hEve,INFINITE); //”释放”~~~应该成为 设置Event SetEvent(hEve);
② MFC下的使用
CEvent cEve; //锁定 cEve.Lock(); //”释放” cEve.SetEvent();
· 总结:
线程的同步总的来说就是一把钥匙开一把锁,我拿着钥匙,你就得等我用完钥匙,转交给你后你才能使用,否则你就只能等着,知道我把钥匙交给你为止.
本文出自悠然品鉴,转载请注明出处!