在线程管理中,线程的阻塞和挂起其实都是等待。即触发一个事件或等待一时间在执行。当然这两者的实现模式不一样。在这里,显示一下我们上课的例子,了解线程的阻塞和挂起的的使用
1.线程的阻塞
/*
阻塞线程
*/
#include<windows.h>
#include<iostream>
using namespace std;
struct Point
{
int x,y,z;
};
DWORD WINAPI threadStartPoint(LPVOID data)
{
Sleep(2000);
Point* p = (Point*)data;
cout<<"shuchu: "<<p->x<<"\t"<<p->y<<"\t"<<p->z<<endl;
cout<<"thread job done"<<endl;
return 0;
}
int main()
{
DWORD threadID;
Point p;
p.x = 2;
p.y = 3;
p.z = 4;
HANDLE handle = CreateThread(0,0,
threadStartPoint,
(LPVOID)&p,
0,&threadID);
//Sleep(2000);
if(!handle)
{
cout<<"failed"<<endl;
}
else
{
cout<<"start on threadid="<<threadID<<endl;
}
WaitForSingleObject(handle, 2000 );
cout<<"main thread exiting..."<<endl;
return 0;
}
2.线程的挂起
/*
挂起线程例子
*/
#include<windows.h>
#include<iostream>
using namespace std;
DWORD WINAPI ThreadProc(LPVOID lpParam)
{
LPDWORD pData;
DWORD i = 0;
pData = (LPDWORD)lpParam;
for(i; i < 10; i++)
{
Sleep(100);
cout<<"TID = "<<GetCurrentThread()<<",Parameters = "<<*pData<<",i="<<i<<endl;
}
ExitThread(i);
return 0;
}
int main()
{
DWORD dwData_1;
DWORD dwData_2;
DWORD dwThreadID[2];
HANDLE hThread[2];
dwData_1 = 1;
dwData_2 = 2;
//创建挂起线程
hThread[0] = CreateThread(
NULL,0,
ThreadProc,&dwData_1,
CREATE_SUSPENDED,
&dwThreadID[0]);
if(hThread[0] == NULL)
{
ExitProcess(0);
}
//创建普通线程
hThread[1] = CreateThread(
NULL,0,
ThreadProc,&dwData_2,
0,
&dwThreadID[1]);
if(hThread[1] == NULL)
{
ExitProcess(0);
}
//休眠
Sleep(200);
//启动0
ResumeThread(hThread[0]);
//挂起1
SuspendThread(hThread[1]);
//正好500会造成少输入一次
Sleep(550);
//输出五次就停止
TerminateThread(hThread[0],0);
//启动1
ResumeThread(hThread[1]);
//
WaitForMultipleObjects(2, hThread, TRUE, INFINITE);
//关闭句柄
CloseHandle(hThread[0]);
CloseHandle(hThread[0]);
}