(1)新建一个控制台工程SellTicketTest,并在向导的“应用程序设置”中勾选“MFC”,因为CCriticalSection属于MFC类,如图所示。

(2)在SellTicketTest.cpp开头中引入头文件。
#include "afxmt.h"
添加两个变量:
int gticketId = 10; //记录卖出的车票号
CCriticalSection gcs; // 定义CCriticalSection对象
(3)创建两个工作线程,然后主线程等待它们执行完毕,线程函数中,每当要卖票了,就先Lock,卖完票后再Unlock。
(4)在int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])中添加如下代码:
CWinThread *pwinthread1, *pwinthread2;
在else中添加如下代码:
puts("利用CCriticalSection同步线程");pwinthread1 = AfxBeginThread(threadfunc, (LPVOID)0);pwinthread2 = AfxBeginThread(threadfunc, (LPVOID)1);WaitForSingleObject(pwinthread1->m_hThread, INFINITE); //等待线程结束WaitForSingleObject((HANDLE)pwinthread2->m_hThread, INFINITE); //等待线程结束puts("卖票结束");
(5)在_tmain函数的前面添加如下代码:
UINT threadfunc(LPVOID param)
{TCHAR chWin;if (param == 0) chWin = _T('甲'); //甲窗口else chWin = _T('乙'); //乙窗口while (1){gcs.Lock();if (gticketId <= 0) //如果车票全部卖出了,则退出循环{gcs.Unlock();break;}setlocale(LC_ALL, "chs"); //为控制台设置中文环境_tprintf(_T("%c窗口卖出的车票号 = %d\n"), chWin, gticketId); //打印信息gticketId--;//车票减少一张gcs.Unlock(); Sleep(1);}return 0;
}
(6)保存工程并按快捷键Ctrl+F5运行,运行结果如图所示:













