对于多线程,当一个线程1在访问一个资源A的时候,
其他线程不能再对资源A进行访问!
必须等到线程1不在访问资源A的时候,其他线程才能去访问资源A。
==>这就需要做:在多个线程之间做一个同步!
1.创建一个互斥器对象
hMutex=CreateMutex(NULL,TRUE,NULL);
参数1(安全属性):
NULL-使用默认的安全性;
参数2(当前创建的这个互斥器的初始拥有者):
TRUE-调用者创建这个互斥器,调用线程获得互斥器的所有权;
FALSE-当前调用线程不获取互斥器的所有权;
参数3(互斥器名称):给创建出来的互斥器/对象,起的一个名字;
NULL-创建一个没有名字的互斥对象;
返回值:这个互斥对象的句柄;
2.重要内容声明
2.1 互斥对象(mutex)属于内核对象,它能够确保线程
拥有对单个资源的互斥访问权;
2.2 互斥对象包含:1个使用数量、1个线程ID、1个计数器;
2.3 ID:用于标识系统中的哪个线程拥有当前的互斥对象;
计数器:用于指明该线程拥有互斥器对象的次数;
#include <windows.h>
//#include <iostream.h>
#include <iostream>
using namespace std;
DWORD WINAPI Fun1Proc(
LPVOID lpParameter // thread data
);DWORD WINAPI Fun2Proc(
LPVOID lpParameter // thread data
);
int index=0;
int tickets=100; //此时,2个线程会访问同一个变量,所以会出问题
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);
CloseHandle(hThread2);
/*while(index++<1000)
cout<<"main thread is running"<<endl;*/
hMutex=CreateMutex(NULL,TRUE,NULL);
/*hMutex=CreateMutex(NULL,TRUE,"tickets");
if(hMutex)
{
if(ERROR_ALREADY_EXISTS==GetLastError())
{
cout<<"only instance can run!"<<endl;
return;
}
}
WaitForSingleObject(hMutex,INFINITE);
ReleaseMutex(hMutex);
ReleaseMutex(hMutex);*/
//为了让线程1和2有时间卖票,这里将主线程睡眠4s钟(主线程会在4s以后,继续执行)
Sleep(4000); //这时候,主线程是不占用CPU时间的
//Sleep(10);
}
DWORD WINAPI Fun1Proc(
LPVOID lpParameter // thread data
)
{
/*while(index++<1000)
cout<<"thread1 is running"<<endl;*/
//while循环是为了不断的销售火车票。
//如果不加循环,当卖出一张票之后,线程函数Fun1Proc执行完成,
//这个线程也就退出了。
while(TRUE)
{
//ReleaseMutex(hMutex);
//WaitForSingleObject(hMutex,INFINITE);
//如果还有票,线程1就继续执行
{
if(tickets>0)
{
Sleep(1);
cout<<"thread1 sell ticket : "<<tickets--<<endl;
}
else
break;
}
//ReleaseMutex(hMutex);
}
/*WaitForSingleObject(hMutex,INFINITE);
cout<<"thread1 is running"<<endl;*/
return 0;
}
DWORD WINAPI Fun2Proc(
LPVOID lpParameter // thread data
)
{
//while循环是为了不断的销售火车票。
while(TRUE)
{
//ReleaseMutex(hMutex);
//WaitForSingleObject(hMutex,INFINITE);
{
//如果还有票,线程2就继续执行
if(tickets>0)
{
Sleep(1);
cout<<"thread2 sell ticket : "<<tickets--<<endl;
}
else
break;
}
//ReleaseMutex(hMutex);
}
//WaitForSingleObject(hMutex,INFINITE);
//cout<<"thread2 is running"<<endl;
return 0;
}