Windows下建立執行緒之生產者 消費者問題

2021-09-18 02:13:00 字數 4783 閱讀 8128

handle createthread(

lpsecurity_attributes lpthreadattributes, //

dword dwstacksize, //

lpthread_start_routine lpstartaddress,

lpvoid lpparameter,

dword dwcreationflags,

lpdword lpthreadid

);lpthreadattrivutes:指向security_attributes的指標,用於定義新執行緒的安全屬性,一般設定成null;

dwstacksize:分配以位元組數表示的執行緒堆疊的大小,預設值是0;

lpstartaddress:指向乙個執行緒函式位址。每個執行緒都有自己的執行緒函式,執行緒函式是執行緒具體的執行**;

lpparameter:傳遞給執行緒函式的引數;

dwcreationflags:表示建立執行緒的執行狀態,其中create_suspend表示掛起當前建立的執行緒,而0表示立即執行當前建立的程序;

lpthreadid:返回新建立的執行緒的id編號;

如果函式呼叫成功,則返回新執行緒的控制代碼,呼叫waitforsingleobject函式等待所建立執行緒的執行結束。函式的格式如下:

dword waitforsingleobject(

handle hhandle,

dword dwmillis,

);hhandle:指定物件或時間的控制代碼;

dwmilliseconds:等待時間,以毫秒為單位,當超過等待時間時,此函式返回。如果引數設定為0,則該函式立即返回;如果設定成infinite,則該函式直到有訊號才返回。

windows下,利用高階程式語言(例如:vs)呼叫createthread()建立兩個執行緒:a:順序遞增輸出1-1000的自然數,b:逆序遞減輸出1000-1的自然數;

#include

#include

dword winapi cthread1

(lpvoid pm)

//int *x = (int *)pm;

//printf("%d\n", *x);列印x;

return0;

}dword winapi cthread2

(lpvoid pm)

return0;

}int

main()

使用方法:

1、建立乙個互斥器:createmutex;

2、開啟乙個已經存在的互斥器:openmutex;

3、獲得互斥器的擁有權:waitforsingleobject、waitformultipleobjects 等一類等待的函式……(可能造成阻塞);

4、釋放互斥器的擁有權:releasemutex;

5、關閉互斥器:closehandle;

handle winapi createmutex(

__in_opt lpsecurity_attributes lpmutexattributes,

__in bool binitialowner,

__in_opt lpctstr lpname

);lpmutexattributes : 第乙個引數表示安全控制,一般直接傳入null。

binitialowner第二個引數用來確定互斥量的初始擁有者。

如果傳入true表示互斥量物件內部會記錄建立它的執行緒的執行緒id號並將遞迴計數設定為1,由於該執行緒id非零,所以互斥量處於未觸發狀態,表示互斥量為建立執行緒擁有。

如果傳入false,那麼互斥量物件內部的執行緒id號將設定為null,遞迴計數設定為0,這意味互斥量不為任何執行緒占用,處於觸發狀態。

lpname第三個引數用來設定互斥量的名稱,在多個程序中的執行緒就是通過名稱來確保它們訪問的是同乙個互斥量。

releasemutex

bool winapi releasemutex(handle hmutex);

乙個執行緒釋放了互斥物件的控制權後,如果其他程序在等待互斥物件置位,則等待的執行緒可以得到該互斥物件,等待函式返回,互斥物件被新的執行緒所擁有。

winapi

releasesemaphore(

__in handle hsemaphore,

__in long lreleasecount,

__out_opt lplong lppreviouscount

);hsemaphore 是要增加的訊號量控制代碼。

lreleasecount 是增加的計數。

lppreviouscount 是增加前的數值返回。

一般為:releasesemaphore(s,1,null)

waitformultipleobjects是windows中的乙個功能非常強大的函式,幾乎可以等待windows中的所有的核心物件

dword waitformultipleobjects(

dword ncount, // number of handles in the handle array

const handle *lphandles, // pointer to the object-handle array

bool fwaitall, // wait flag

dword dwmilliseconds // time-out interval in milliseconds

);dword 就是 double word, 每個word為2個位元組的長度,dword雙字即為4個位元組,每個位元組是8位。

ncount 指定列表中的控制代碼數量 最大值為maximum_wait_objects(64)

*lphandles 控制代碼陣列的指標。lphandles為指定物件控制代碼組合中的第乙個元素 handle型別可以為(event,mutex,process,thread,semaphore)陣列

bwaitall 等待的型別,如果為true,表示除非物件都發出訊號,否則就一直等待下去;如果false,表示任何物件發出訊號即可

dwmilliseconds指定要等候的毫秒數。如設為零,表示立即返回。如指定常數infinite,則可根據實際情況無限等待下去

#include

#include

#include

#include

#define numpro 2;

#define numcon 3;

#define n 10

int buf[n]=;

//緩衝區初始值為空

handle empty, full, mutex;

int in =

0, out =0;

void

printbuf()

printf

("\n");

printf

("\n");

}void

fprintbuf

(file *fp)

fprintf

(fp,

"\n");

fprintf

(fp,

"\n");

}dword winapi produce_1

(lpvoid pm)

else

fclose

(fp)

;printbuf()

; in =

(in +1)

% n;

releasemutex

(mutex)

;releasesemaphore

(full,1,

null);

}}dword winapi produce_2

(lpvoid pm)

else

fclose

(fp)

;printbuf()

; in =

(in +1)

% n;

releasemutex

(mutex)

;releasesemaphore

(full,1,

null);

}}dword winapi consumer

(lpvoid pm)

else

fclose

(fp)

; buf[out]=0

; out =

(out +1)

% n;

printbuf()

;releasemutex

(mutex)

;releasesemaphore

(empty,1,

null);

}}intmain()

;for

(j =

0; j <

3; j++)

hhandle[3]

=createthread

(null,0

, produce_1,

&temp[0]

,0,null);

hhandle[4]

=createthread

(null,0

, produce_2,

&temp[1]

,0,null);

waitformultipleobjects

(num, hhandle, true, infinite)

;system

("pause");

return0;

}

管理執行緒之建立執行緒

基本的執行緒管理包括 1 建立執行緒。2 等待它結束或在後台執行。3 向執行緒函式傳遞引數,更改執行緒物件所有權。4 選擇執行緒和使用特定執行緒。void do some work std thread my thread do some work 這是最簡單的情況,std thread還可以使用可...

執行緒之執行緒的建立

在傳統的unix程序模型中,每個程序只有乙個控制線程。從概念上講,這與基於執行緒的模型中只包含乙個執行緒是相同的。在posix執行緒 pthread 的情況下,程式開始執行時,它也是以單程序中的單個控制線程啟動的,在建立多個控制線程以前,程式的行為與傳統的程序並沒有什麼區別。新增的執行緒可以通過呼叫...

多執行緒之生產消費問題

問題 乙個倉庫最多容納6個產品,製造商現在要製造20件產品存入倉庫,消費者要從倉庫取出20件產品來消費,製造商生產產品和消費者消費產品的速度很可能不一樣!定義倉庫 author liao class syncstack catch exception e 通知正在等待的執行緒進入就緒狀態 可能不會立...