1 Windows线程
Windows进程中可以执行代码的实体,Windows系统可以调度的执行代码.一个进程中至少有
一个或多个线程. 每个线程是进程的一个任务
分支.
2 线程的特点
2.1 每个线程有一个ID.2.2 每个线程有自己的安全属性
2.3 每个线程有自己的内存栈.
3 进程和线程多任务
多进程实现的多任务: 由于进程地址空间是属于各自私有, 内存和资源不能共享.
多线程实现的多任务: 由于线程都是位于
同一个进程的地址空间,内存和资源可以
共享.
4 线程的执行
线程的执行方式采用轮询方式执行.A -> B -> A -> B.....
线程的使用
1 定义线程处理函数
DWORD WINAPI ThreadProc(LPVOID lpParameter ); //线程参数
2 创建线程
HANDLE CreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes,
//安全属性
DWORD dwStackSize, //初始化栈的大小,缺省为0
LPTHREAD_START_ROUTINE lpStartAddress,
//线程的函数指针
LPVOID lpParameter, //线程参数
DWORD dwCreationFlags, //创建方式
LPDWORD lpThreadId //返回线程ID
);
返回值是创建好的线程的句柄.
3 结束线程
ExitThreadTerminateThread
4 线程挂起和执行
挂起线程DWORD SuspendThread( HANDLE hThread );
执行线程
DWORD ResumeThread( HANDLE hThread );
5 等候线程的结束
可以使用 WaitForSingleObject 等候线程的结束。
6 关闭线程句柄
CloseHandle 释放句柄资源,不代表关闭线程,线程继续执行,只是句柄不能用了
// ThreadBase.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "conio.h"
#include "windows.h"
DWORD WINAPI ThreadProc1( LPVOID pParam )
{
DWORD nValue = (DWORD)pParam;
for( int nIndex=0; nIndex<10; nIndex++ )
{
printf( "Thread Proc1-------%d\n",
nValue );
Sleep( 1000 );
}
return 0;
}
DWORD WINAPI ThreadProc2( LPVOID pParam )
{
while( 1 )
{
printf( "-------Thread Proc2\n" );
Sleep( 1000 );
}
return 0;
}
void Create( )
{ DWORD nValue = 100;
//创建一个挂起的线程
DWORD nThreadID = 0;
HANDLE hThread = CreateThread( NULL, 0,
ThreadProc1, (LPVOID)nValue,
CREATE_SUSPENDED, &nThreadID );
printf( "Thread 1 ID: %d\n", nThreadID );
printf( "Thread 1 Handle: %p\n", hThread );
//执行线程
ResumeThread( hThread );
//等候线程1结束
WaitForSingleObject( hThread, INFINITE );
CloseHandle( hThread );
//创建一个立刻执行的线程
hThread = CreateThread( NULL, 0,
ThreadProc2, NULL, 0, &nThreadID );
printf( "Thread 2 ID: %d\n", nThreadID );
printf( "Thread 2 Handle: %p\n", hThread );
//挂起线程
//SuspendThread( hThread );
CloseHandle( hThread );
}
int main(int argc, char* argv[])
{
Create( );
getch( );
return 0;
}