首页 > 代码库 > 多线程-5

多线程-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

);

lpMutexAttributesNULL,默认安全性

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

返回非零表示成功