作業系統實驗三 生產者,消費者

2021-08-20 10:36:31 字數 3306 閱讀 5781

實驗任務

生產者/消費者模型為依據,在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 互斥...