#include "stdafx.h"
#include "windows.h"
#include "stdio.h"
volatileint ThreadData =1;
CRITICAL_SECTION csPrint; // 臨界區
//HANDLE evtPrint; // 事件信號,標記事件是否已發生
//HANDLE mtxPrint; // 互斥信號,如有信號表明已經有線程進入臨界區並擁有此信號
//HANDLE smphPrint; // 信號量,表示是否已經達到允許的最大線程數
void Print(char*str)
{
EnterCriticalSection(&csPrint); // 進入臨界區
//WaitForSingleObject(evtPrint, INFINITE); // 等待事件有信號
//WaitForSingleObject(mtxPrint, INFINITE); // 等待互斥量空置(沒有線程擁有它)
//WaitForSingleObject(smphPrint, INFINITE); // 等待對共享資源請求被通過 等於 P操作
for (;*str !='\0';str++)
{
Sleep(50);
printf("%c",*str);
}
printf("\n");
LeaveCriticalSection(&csPrint); // 退出臨界區
//SetEvent(evtPrint); // 把事件信號量恢復,變爲有信號
//ReleaseMutex(mtxPrint); // 釋放對互斥量的佔有
//ReleaseSemaphore(smphPrint, 1, NULL); // 釋放共享資源 等於 V操作
}
void ThreadProcess()
{
for(int i=0; i<6; i++)
{
Sleep(1000);
Print("Sub Thread is running!");
}
ThreadData =0;
}
int _tmain(int argc, _TCHAR* argv[])
{
HANDLE hThread;
DWORD ThreadID;
InitializeCriticalSection(&csPrint); // 初始化臨界區
//evtPrint = CreateEvent(NULL, FALSE, TRUE, L"PrintEvent"); // 初始化事件
//mtxPrint = CreateMutex(NULL, FALSE, L"PrintMutex"); // 初始化互斥量
//smphPrint= CreateSemaphore(NULL, 1, 1, L"PrintSemaphore"); // 設置信號量1個資源,因此同時只可以有一個線程訪問
hThread=CreateThread(NULL,
0,
(LPTHREAD_START_ROUTINE)ThreadProcess,
NULL,
0,
&ThreadID);
while (ThreadData)
{
Print("Main Thread is waiting for Sub Thread!");
Sleep(600);
}
printf("Main Thread Finished!");
system("pause");
return0;
}
多線程的互斥
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.