本文共 1479 字,大约阅读时间需要 4 分钟。
#include "stdafx.h"
![20090727111518754.gif](http://c.chinaitlab.com/UploadFiles_4204/200907/20090727111518754.gif)
#include "windows.h"
![20090727111518754.gif](http://c.chinaitlab.com/UploadFiles_4204/200907/20090727111518754.gif)
#include "stdio.h"
![20090727111518754.gif](http://c.chinaitlab.com/UploadFiles_4204/200907/20090727111518754.gif)
volatileint ThreadData =1;
![20090727111518754.gif](http://c.chinaitlab.com/UploadFiles_4204/200907/20090727111518754.gif)
![20090727111518754.gif](http://c.chinaitlab.com/UploadFiles_4204/200907/20090727111518754.gif)
CRITICAL_SECTION csPrint;
// 临界区
//HANDLE evtPrint; // 事件信号,标记事件是否已发生
//HANDLE mtxPrint; // 互斥信号,如有信号表明已经有线程进入临界区并拥有此信号
//HANDLE smphPrint; // 信号量,表示是否已经达到允许的最大线程数![20090727111518754.gif](http://c.chinaitlab.com/UploadFiles_4204/200907/20090727111518754.gif)
void Print(
char*str)
![20090727111519183.gif](http://c.chinaitlab.com/UploadFiles_4204/200907/20090727111519183.gif)
![20090727111520790.gif](http://c.chinaitlab.com/UploadFiles_4204/200907/20090727111520790.gif)
{
EnterCriticalSection(&csPrint); // 进入临界区
//WaitForSingleObject(evtPrint, INFINITE); // 等待事件有信号
//WaitForSingleObject(mtxPrint, INFINITE); // 等待互斥量空置(没有线程拥有它)
//WaitForSingleObject(smphPrint, INFINITE); // 等待对共享资源请求被通过 等于 P操作 ![20090727111520749.gif](http://c.chinaitlab.com/UploadFiles_4204/200907/20090727111520749.gif)
for (;*str !='\0';str++)![20090727111520253.gif](http://c.chinaitlab.com/UploadFiles_4204/200907/20090727111520253.gif)
![20090727111520266.gif](http://c.chinaitlab.com/UploadFiles_4204/200907/20090727111520266.gif)
{
Sleep(50);
printf("%c",*str);
}
printf("\n");![20090727111520749.gif](http://c.chinaitlab.com/UploadFiles_4204/200907/20090727111520749.gif)
LeaveCriticalSection(&csPrint); // 退出临界区
//SetEvent(evtPrint); // 把事件信号量恢复,变为有信号
//ReleaseMutex(mtxPrint); // 释放对互斥量的占有
//ReleaseSemaphore(smphPrint, 1, NULL); // 释放共享资源 等于 V操作 ![20090727111520749.gif](http://c.chinaitlab.com/UploadFiles_4204/200907/20090727111520749.gif)
}![20090727111518754.gif](http://c.chinaitlab.com/UploadFiles_4204/200907/20090727111518754.gif)
void ThreadProcess()
![20090727111519183.gif](http://c.chinaitlab.com/UploadFiles_4204/200907/20090727111519183.gif)
![20090727111520790.gif](http://c.chinaitlab.com/UploadFiles_4204/200907/20090727111520790.gif)
{
for(int i=0; i<6; i++)![20090727111520253.gif](http://c.chinaitlab.com/UploadFiles_4204/200907/20090727111520253.gif)
![20090727111520266.gif](http://c.chinaitlab.com/UploadFiles_4204/200907/20090727111520266.gif)
{
Sleep(1000);
Print("Sub Thread is running!");
}
ThreadData =0;![20090727111520749.gif](http://c.chinaitlab.com/UploadFiles_4204/200907/20090727111520749.gif)
}![20090727111518754.gif](http://c.chinaitlab.com/UploadFiles_4204/200907/20090727111518754.gif)
int _tmain(
int argc, _TCHAR* argv[])
![20090727111519183.gif](http://c.chinaitlab.com/UploadFiles_4204/200907/20090727111519183.gif)
![20090727111520790.gif](http://c.chinaitlab.com/UploadFiles_4204/200907/20090727111520790.gif)
{
HANDLE hThread;
DWORD ThreadID;![20090727111520749.gif](http://c.chinaitlab.com/UploadFiles_4204/200907/20090727111520749.gif)
InitializeCriticalSection(&csPrint); // 初始化临界区
//evtPrint = CreateEvent(NULL, FALSE, TRUE, L"PrintEvent"); // 初始化事件
//mtxPrint = CreateMutex(NULL, FALSE, L"PrintMutex"); // 初始化互斥量
//smphPrint= CreateSemaphore(NULL, 1, 1, L"PrintSemaphore"); // 设置信号量1个资源,因此同时只可以有一个线程访问 ![20090727111520749.gif](http://c.chinaitlab.com/UploadFiles_4204/200907/20090727111520749.gif)
hThread=CreateThread(NULL,
0,
(LPTHREAD_START_ROUTINE)ThreadProcess,
NULL,
0,
&ThreadID);![20090727111520749.gif](http://c.chinaitlab.com/UploadFiles_4204/200907/20090727111520749.gif)
while (ThreadData)![20090727111520253.gif](http://c.chinaitlab.com/UploadFiles_4204/200907/20090727111520253.gif)
![20090727111520266.gif](http://c.chinaitlab.com/UploadFiles_4204/200907/20090727111520266.gif)
{
Print("Main Thread is waiting for Sub Thread!");
Sleep(600);
}![20090727111520749.gif](http://c.chinaitlab.com/UploadFiles_4204/200907/20090727111520749.gif)
printf("Main Thread Finished!");
system("pause");
return0;
} 转载于:https://blog.51cto.com/nster/1260404