多線程的互斥

#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;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章