#include "stdafx.h"

20090727111518754.gif#include "windows.h"
20090727111518754.gif#include "stdio.h"
20090727111518754.gif
20090727111518754.gifvolatileint ThreadData =1;
20090727111518754.gif
20090727111518754.gifCRITICAL_SECTION csPrint; // 临界区
20090727111518754.gif
//HANDLE evtPrint; // 事件信号,标记事件是否已发生
20090727111518754.gif
//HANDLE mtxPrint; // 互斥信号,如有信号表明已经有线程进入临界区并拥有此信号
20090727111518754.gif
//HANDLE smphPrint; // 信号量,表示是否已经达到允许的最大线程数
20090727111518754.gif
20090727111518754.gifvoid Print(char*str)
20090727111519183.gif20090727111520790.gif20090727111520412.gif{
20090727111520749.gif    EnterCriticalSection(&csPrint); // 进入临界区
20090727111520749.gif
//WaitForSingleObject(evtPrint, INFINITE); // 等待事件有信号
20090727111520749.gif
//WaitForSingleObject(mtxPrint, INFINITE); // 等待互斥量空置(没有线程拥有它)
20090727111520749.gif
//WaitForSingleObject(smphPrint, INFINITE); // 等待对共享资源请求被通过 等于 P操作
20090727111520749.gif
20090727111520749.giffor (;*str !='\0';str++)
20090727111520253.gif20090727111520266.gif20090727111520412.gif{
20090727111520749.gif        Sleep(50);
20090727111520749.gif        printf("%c",*str);
20090727111520221.gif    }
20090727111520749.gif    printf("\n");
20090727111520749.gif
20090727111520749.gif    LeaveCriticalSection(&csPrint); // 退出临界区
20090727111520749.gif
//SetEvent(evtPrint); // 把事件信号量恢复,变为有信号
20090727111520749.gif
//ReleaseMutex(mtxPrint); // 释放对互斥量的占有
20090727111520749.gif
//ReleaseSemaphore(smphPrint, 1, NULL); // 释放共享资源 等于 V操作
20090727111520749.gif
20090727111520484.gif}
20090727111518754.gif
20090727111518754.gifvoid ThreadProcess()
20090727111519183.gif20090727111520790.gif20090727111520412.gif{
20090727111520749.giffor(int i=0; i<6; i++)
20090727111520253.gif20090727111520266.gif20090727111520412.gif{
20090727111520749.gif        Sleep(1000);
20090727111520749.gif        Print("Sub  Thread is running!");
20090727111520221.gif    }
20090727111520749.gif    ThreadData =0;
20090727111520749.gif
20090727111520484.gif}
20090727111518754.gif
20090727111518754.gifint _tmain(int argc, _TCHAR* argv[])
20090727111519183.gif20090727111520790.gif20090727111520412.gif{
20090727111520749.gif    HANDLE hThread;
20090727111520749.gif    DWORD ThreadID;
20090727111520749.gif
20090727111520749.gif    InitializeCriticalSection(&csPrint); // 初始化临界区
20090727111520749.gif
//evtPrint = CreateEvent(NULL, FALSE, TRUE, L"PrintEvent"); // 初始化事件
20090727111520749.gif
//mtxPrint = CreateMutex(NULL, FALSE, L"PrintMutex"); // 初始化互斥量
20090727111520749.gif
//smphPrint= CreateSemaphore(NULL, 1, 1, L"PrintSemaphore"); // 设置信号量1个资源,因此同时只可以有一个线程访问
20090727111520749.gif
20090727111520749.gif    hThread=CreateThread(NULL,
20090727111520749.gif0,
20090727111520749.gif        (LPTHREAD_START_ROUTINE)ThreadProcess,
20090727111520749.gif        NULL,
20090727111520749.gif0,
20090727111520749.gif&ThreadID);
20090727111520749.gif
20090727111520749.gifwhile (ThreadData)
20090727111520253.gif20090727111520266.gif20090727111520412.gif{
20090727111520749.gif        Print("Main Thread is waiting for Sub Thread!");
20090727111520749.gif        Sleep(600);
20090727111520221.gif    }
20090727111520749.gif
20090727111520749.gif    printf("Main Thread Finished!");
20090727111520749.gif    system("pause");
20090727111520749.gifreturn0;
20090727111520484.gif}