一 创建线程
函数:
HANDLE CreateThread( LPSECURITY_ATTRIBUTES lpThreadAttributes, // SD DWORD dwStackSize, // initial stack size LPTHREAD_START_ROUTINE lpStartAddress, // thread function LPVOID lpParameter, // thread argument DWORD dwCreationFlags, // creation option LPDWORD lpThreadId // thread identifier );
参数:
lpThreadAttributes 一般为NULL NULL使用默认安全性,不可以被子线程继承,否则需要定义一个结构体将它的bInheritHandle成员初始化为TRUEdwstacksize 设置初始栈的大小,以字节为单位,如果为0,那么默认将使用与调用该函数的线程相同的栈空间的大小
lpstartaddress 线程函数的指针
lpparameter 给线程函数发送的参数指针,可谓结构体指针,对象指针
lpthreadid 用于保存新线程的id
返回值:
返回创建线程的句柄 HANDLE 类型
线程函数写法:
DWORD WINAPI ThreadProc( LPVOID lpParameter // thread data );在线程创建完成后 许调用closehandle()函数 关闭句柄二 创建临界对象函数1:HANDLE CreateMutex( LPSECURITY_ATTRIBUTES lpMutexAttributes, // SD BOOL bInitialOwner, // initial owner LPCTSTR lpName // object name );参数:lpmutexattributes 线程的安全性,如果是NULL 则线程不能被继承bInitialOwner 创建该线程的线程是否拥有该互斥对象lpName 互斥对象的名字返回值:返回互斥对象的句柄 handle函数2:DWORD WaitForSingleObject( HANDLE hHandle, // handle to object DWORD dwMilliseconds // time-out interval );参数:hHandle 用createmutex创建的临界区对象的句柄dwMilliseconds 定时时间间隔,单位为milliseconds(毫秒).如果指定一个非零值,函数处于等待状态直到hHandle标记的对象被触发,或者时间到了。如果dwMilliseconds为0,对象没有被触发信号,函数不会进入一个等待状态,它总是立即返回。如果dwMilliseconds为INFINITE,对象被触发信号后,函数才会返回。
调用后 需要调用BOOL ReleaseMutex( HANDLE hMutex // handle to mutex );函数 释放句柄互斥对象 拥有一个使用数量 和 一个线程id ,和一个计数器在一个线程中调用waitforsingleobject 在另一个线程中releasemutex 释放的互斥对象 不是同一个,因为互斥对象的线程id表示那个想成调用的互斥对象在使用互斥对象时 如果调用两次waitforsingleobject 需调用两次releasemutex 才可以,否子计数器为2,release一次 计数器为1,互斥对象仍为无信号状态#include<windows.h> #include<iostream> using namespace std; DWORD WINAPI Fun1Proc(LPVOID lpParameter); DWORD WINAPI Fun2Proc(LPVOID lpParameter); int ticks = 100; HANDLE hmutex; void main() { HANDLE handle1; HANDLE handle2; handle1 = CreateThread(NULL,0,Fun1Proc,NULL,0,NULL); handle2 = CreateThread(NULL,0,Fun2Proc,NULL,0,NULL); CloseHandle(handle1); CloseHandle(handle2); hmutex = CreateMutex(NULL,false,TEXT("tickets")); if(hmutex) { if( ERROR_ALREADY_EXISTS == GetLastError()) { cout<<"only one running"<<endl; return ; } } Sleep(1000); } DWORD WINAPI Fun1Proc(LPVOID lpParameter) { while(1) { WaitForSingleObject(hmutex,INFINITE); if(ticks > 0 ) cout<<"thread1 sell ticke"<<ticks--<<endl; else break; ReleaseMutex(hmutex); } return 0; } DWORD WINAPI Fun2Proc(LPVOID lpParameter) { while(1) { WaitForSingleObject(hmutex,INFINITE); if(ticks > 0 ) cout<<"thread2 sell ticke"<<ticks--<<endl; else break; ReleaseMutex(hmutex); } return 0; }