實驗任務
生產者/消費者模型為依據,在windows環境下建立乙個控制台程序,在該程序中建立n個執行緒模擬生產者和消費者,實現程序(執行緒)的同步與互斥。
基礎知識:
createmutex的用法(詳見官方文件)
handle createmutex(
lpsecurity_attributes lpmutexattributes, // 指向安全屬性的指標
bool binitialowner, // 初始化互斥物件的所有者
lpctstr lpname // 指向互斥物件名的指標
);
createmutex只是建立了一把鎖, 這把鎖你用來鎖門還是鎖抽屜都由你自己決定。
lpname是指定這把鎖的名字. 你要不給這把鎖取個名字都可以. 只是有了相同的名字, 在跨程序加鎖的時候, 就可以得到同一把鎖。
//加鎖
waitforsingleobject(hmutex, infinite);
//解鎖
releasemutex(hmutex);
createsemaphore和releasesemaphore函式
handle winapi createsemaphore(
_in_opt_ lpsecurity_attributes lpsemaphoreattributes
_in_ long linitialcount,
_in_ long lmaximumcount,
_in_opt_ lpctstr lpname
);
第乙個引數:安全屬性,如果為null則是預設安全屬性
第二個引數:訊號量的初始值,要》=0且<=第三個引數
第三個引數:訊號量的最大值
第四個引數:訊號量的名稱
返回值:指向訊號量的控制代碼,如果建立的訊號量和已有的訊號量重名,那麼返回已經存在的訊號量控制代碼
releasesemaphore(
__in handle hsemaphore,
__in long lreleasecount,
__out_opt lplong lppreviouscount
);
hsemaphore是要釋放的訊號量名字。
lreleasecount是增加的計數。
lppreviouscount是增加前的數值返回。
使用方法:
1、建立乙個訊號量:createsemaphore;
2、開啟乙個已經存在的訊號量:opensemaphore;
3、獲得訊號量的乙個佔有權:waitforsingleobject、waitformultipleobjects 等一類等待的函式……(可能造成阻塞);
4、釋放訊號量的佔有權:releasesemaphore;
5、關閉訊號量:closehandle;
訊號量的使用規則:
1. 如果當前資源計數大於0,那麼訊號量處於觸發狀態;
2. 如果當前資源計數等於0,那麼訊號量處於未觸發狀態;那麼系統會讓呼叫執行緒進入等待狀態。
createsemaphore(null,0,1,null); 當第二個引數為0時,呼叫執行緒就會進入等待狀態
3. 系統絕對不會讓當前資源計數變為負數;
4. 當前資源計數絕對不會大於最大資源計數。
5. 建立執行緒createthread函式
預設的執行緒函式必須具有如下原型dword winapi threadproc(lpvoid lpparameter);
呼叫api:createthread可以建立乙個新程序
handle winapi createthread(
lpsecurity_attributes lpthreadattributes,
size_t dwstacksize,
lpthread_start_routine lpstartaddress,
lpvoid lpparameter,
dword dwcreationflags,
lpdword lpthreadid
);
lpthreadattributes:其中安全屬性引數指定的是建立新程序核心物件的安全屬性,不是執行緒訪問字串(token)的屬性
dwstacksize用於指定執行緒初始時的棧大小,通常傳入0即可,此時系統會使用乙個合適的大小
lpstartaddress就是新程序入口函式的位址
lpparameter就是傳入執行緒入口的引數,這個引數完全由呼叫者使用,系統只是簡單的將這個引數
傳遞給執行緒函式,並不做別的任何處理
dwcreationflags指出建立執行緒的方式,如果是0,表示執行緒一被建立就被立即執行,如果是create_suspended,表示執行緒一被建立先暫停,並不執行,在xp以上的系統中此引數還可以結合乙個stack_size_param_is_a_reservation
用於指出設定dwstacksize起始只是為執行緒棧保留的虛擬位址空間的大小,並不需要實際提交那麼多物理頁面
如果沒有指定這個標誌位,那麼dwstacksize也是實際提交記憶體的大小值
lpthreadid則用於得到執行緒唯一的識別符號
windows環境下**
#include
#include
#include
#include
using namespace std;
const
int buffer_size=10;
int buffer[buffer_size];
int front,rear;
bool full;
handle mutex;
handle full;
handle empty;
void showbuffer()while(i!=rear);
}else
cout<<"empty";
cout<<"\n*******************************"
int remove_item(int item)
dword winapi producer(void *param)
};dword winapi consumer(void *param)
};int main(int argc, char *argv)
C 多執行緒 三 生產者和消費者
前面說過,每個執行緒都有自己的資源,但是 區是共享的,即每個執行緒都可以執行相同的函式。這可能帶來的問題就是幾個執行緒同時執行乙個函式,導致資料的混亂,產生不可預料的結果,因此我們必須避免這種情況的發生。c 提供了乙個關鍵字lock,它可以把一段 定義為互斥段 critical section 互斥...
C C 多執行緒學習 三 生產者和消費者
前面說過,每個執行緒都有自己的資源,但是 區是共享的,即每個執行緒都可以執行相同的函式。這可能帶來的問題就是幾個執行緒同時執行乙個函式,導致資料的混亂,產生不可預料的結果,因此我們必須避免這種情況的發生。c 提供了乙個關鍵字lock,它可以把一段 定義為互斥段 critical section 互斥...
C 多執行緒學習 三 生產者和消費者
前面說過,每個執行緒都有自己的資源,但是 區是共享的,即每個執行緒都可以執行相同的函式。這可能帶來的問題就是幾個執行緒同時執行乙個函式,導致資料的混亂,產生不可預料的結果,因此我們必須避免這種情況的發生。c 提供了乙個關鍵字lock,它可以把一段 定義為互斥段 critical section 互斥...