對於多線程,當一個線程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;
}