(1)新建一个控制台工程SellTicketTest2,并在向导的“应用程序设置”中勾选“MFC”。
(2)打开SellTicketTest2.cpp,在开头中引入头文件。
#include "afxmt.h"
(3)添加变量:
int gticketId = 10; //记录卖出的车票号
CCriticalSection gcs; // 定义CCriticalSection对象
CSingleLock singleLock(&gcs);
CSingleLock singleLock2(&gcs);
(4)创建工作线程函数,代码如下:
UINT threadfunc(LPVOID param)
{TCHAR chWin;if (param == 0) chWin = _T('甲'); //甲窗口else chWin = _T('乙'); //乙窗口while (1){if (param==0)singleLock.Lock();else singleLock2.Lock();if (gticketId <= 0) //如果车票全部卖出了,则退出循环{if (param == 0)singleLock.Unlock();else singleLock2.Unlock();break;}setlocale(LC_ALL, "chs"); //为控制台设置中文环境_tprintf(_T("%c窗口卖出的车票号 = %d\n"), chWin, gticketId); //打印信息gticketId--;//车票减少一张if (param == 0)singleLock.Unlock();else singleLock2.Unlock();Sleep(1);}return 0;
}
(5)在int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])中添加如下代码:
CWinThread *pwinthread1, *pwinthread2;
在else中添加如下代码:
else{// TODO: 在此处为应用程序的行为编写代码。puts("联合使用类CCriticalSection和类CSingleLock来同步线程");pwinthread1 = AfxBeginThread(threadfunc, (LPVOID)0);pwinthread2 = AfxBeginThread(threadfunc, (LPVOID)1);WaitForSingleObject(pwinthread1->m_hThread, INFINITE); //等待线程结束WaitForSingleObject((HANDLE)pwinthread2->m_hThread, INFINITE); //等待线程结束puts("卖票结束");}
(6)保存工程并按快捷键Ctrl+F5运行,运行结果如图所示:














