多线程-5
#include <windows.h>
#include <iostream.h> //using namespace std; DWORD WINAPI Fun1Proc( LPVOID lpParameter // thread data ); DWORD WINAPI Fun2Proc( LPVOID lpParameter // thread data ); int index=0; int tickets=100; HANDLE hMutex; void main() { HANDLE hThread1;//线程的句柄 HANDLE hThread2; hThread1=CreateThread(NULL,0,Fun1Proc,NULL,0,NULL); hThread2=CreateThread(NULL,0,Fun2Proc,NULL,0,NULL); CloseHandle(hThread1);//关闭句柄,并没有终止线程,表示主线程中对该句柄不感兴趣。
//当关闭句柄的时候,会递减新线程的线程内核对象的使用计数,
//线程执行完毕后,也会递减使用计数 //当使用计数为0时,系统会释放线程内核对象 CloseHandle(hThread2); hMutex=CreateMutex(NULL,FALSE,NULL);//创建一个匿名的互斥对象.False 没有线程拥有该互斥对象, //操作系统会将该互斥对象设为已通知状态,即有信号状态 Sleep(4000);//主线程放弃执行权力,进入等待状态 } DWORD WINAPI Fun1Proc(LPVOID lpParameter) { while(TRUE) { WaitForSingleObject(hMutex,INFINITE);//第一个线程运行,hMutex处于有信号状态,线程请求到了互斥对象 //OS将互斥对象的ID设为该线程的ID。得到这个互斥对象后 //OS会将该互斥对象设为未通知状态 if(tickets>0) { Sleep(1); cout<<"thread1 cell ticket:"<<tickets--<<endl; } else break; ReleaseMutex(hMutex);//将互斥对象ID设为0,将互斥对象设为已通知状态 } return 0; } DWORD WINAPI Fun2Proc(LPVOID lpParameter) { while(TRUE) { WaitForSingleObject(hMutex,INFINITE); if(tickets>0) { cout<<"thread2 cell ticket:"<<tickets--<<endl; Sleep(1); } else break; ReleaseMutex(hMutex); } return 0; }
创建互斥对象的函数:
HANDLE CreateMutex(
LPSECURITY_ATTRIBUTES lpMutexAttributes, // SD
BOOL bInitialOwner, // initial owner
LPCTSTR lpName // object name
);
lpMutexAttributes:NULL,默认安全性
bInitialOwner:指互斥对象初始拥有者。如果这个值为真,那么调用者创建互斥对象,调用的线程获得互斥对象的所有权,否则不获得所有权。
lpName:给互斥对象取个名字
互斥对象说与内核对象,它能够确保线程拥有单个资源的互斥访问权。
互斥对象包含一个使用数量,一个线程ID和一个计数器。
ID用于标识系统中的哪个线程当前拥有互斥对象,计数器用于指明该线程拥有互斥对象的次数。
根据互斥对象是否已经请求到了,等待:
WaitForSingleObject
The WaitForSingleObject functionreturns when one of the following occurs:
- The specified object is in the signaled state.
- The time-out interval elapses.
To enter an alertable wait state, use the WaitForSingleObjectExfunction. To wait for multiple objects, use theWaitForMultipleObjects.
DWORD WaitForSingleObject(
HANDLE hHandle, // handleto object
DWORD dwMilliseconds // time-out interval
);
hHandle:互斥对象的句柄,互斥对象变为有信号状态,函数返回。若始终没有处于有信号状态,函数就会一直等待。等待就会导致线程暂时运行。
dwMilliseconds:指超时的时间间隔。0,立即返回,INFINITE,永远等待,除非有信号
释放互斥对象--谁拥有互斥对象,谁释放。本例中main函数创建,只能在main函数中释放
ReleaseMutex
This function releases ownership of thespecified mutex object.
BOOL ReleaseMutex(
HANDLE hMutex);
返回非零表示成功