进程的阻塞和挂起

     在线程管理中,线程的阻塞和挂起其实都是等待。即触发一个事件或等待一时间在执行。当然这两者的实现模式不一样。在这里,显示一下我们上课的例子,了解线程的阻塞和挂起的的使用

   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]);

}


 

你可能感兴趣的:(进程的阻塞和挂起)