使用WaitForSingleObject
实现,线程1和线程2之间互斥,仅能运行一个线程。如下代码在VS2019 MFC下运行,
static BOOL g_NeedCacncel = FALSE;
HANDLE g_Mutex = NULL;
// OnInitDialog中调用init
void CWinThreadTestDlg::init() {
g_Mutex = CreateMutex(NULL, false, NULL);
}
// close时候调用uninit
void CWinThreadTestDlg::uninit() {
if (g_Mutex) CloseHandle(g_Mutex);
}
static void LogMsg(CString pstrFormat, ...) {
CString sFormat = pstrFormat;
if (sFormat.Right(1) != _T("\n")) {
sFormat += _T("\n");
}
TCHAR szBuffer[2048] = { 0 };
va_list argList;
va_start(argList, pstrFormat);
int iRet = _vstprintf(szBuffer, sFormat, argList);
va_end(argList);
OutputDebugString(szBuffer);
}
static BOOL checkCancel() {
return g_NeedCacncel;
}
static void setCancel(BOOL flag) {
g_NeedCacncel = flag;
}
DWORD WINAPI Thread1(LPVOID pParam) {
if (WaitForSingleObject(g_Mutex, 1) != WAIT_OBJECT_0) {
setCancel(TRUE);
WaitForSingleObject(g_Mutex, INFINITE);
}
setCancel(FALSE);
do {
if (checkCancel()) break;
Sleep(500);
LogMsg(_T("Thread 1.\n"));
} while (TRUE);
ReleaseMutex(g_Mutex);
return 0;
}
DWORD WINAPI Thread2(LPVOID pParam) {
if (WaitForSingleObject(g_Mutex, 1) != WAIT_OBJECT_0) {
setCancel(TRUE);
WaitForSingleObject(g_Mutex, INFINITE);
}
setCancel(FALSE);
do {
if (checkCancel()) break;
Sleep(500);
LogMsg(_T("Thread 2.\n"));
} while (TRUE);
ReleaseMutex(g_Mutex);
return 0;
}
void CWinThreadTestDlg::OnBnClickedButton1() {
// TODO: 在此添加控件通知处理程序代码
CreateThread(NULL, 0, Thread1, NULL, 0, NULL);
}
void CWinThreadTestDlg::OnBnClickedButton2() {
// TODO: 在此添加控件通知处理程序代码
CreateThread(NULL, 0, Thread2, NULL, 0, NULL);
}