雙線程讀寫佇列資料

2021-09-30 16:28:02 字數 1425 閱讀 9018

mfc對話方塊中乙個按鈕的響應函式實現兩個功能:

顯示資料同時處理資料,因此開兩個執行緒,乙個執行緒顯示資料(開了乙個定時器,響應wm_timer訊息按照一定時間間隔向teechart圖表新增資料並顯示)同時在佇列隊尾新增資料,另乙個執行緒從該隊列隊頭去資料來處理。

下面就來解決這個案例。先來分析下:

這個案例是乙個執行緒向佇列中的佇列頭部讀取資料,乙個執行緒向佇列中的佇列尾部寫入資料。看起來很像讀者寫者問題,但其實不然,如果將佇列看成緩衝區,這個案例明顯是個生產者消費者問題。因此我們仿照生產者消費者的思路來具體分析下案例中的「等待」情況:

1.     當隊列為空時,讀取資料執行緒必須等待寫入資料向佇列中寫入資料。也就是說當隊列為空時,讀取資料執行緒要等待佇列中有資料。

2.     當佇列滿時,寫入資料線程必須等待讀取資料執行緒向佇列中讀取資料。也就是說當佇列滿時,寫入資料線程要等待佇列中有空位。

在訪問佇列時,需要互斥嗎?這將依賴於佇列的資料結構實現,如果使用stl中的vector,由於vector會動態增長。因此要做互斥保護。如果使用迴圈佇列,那麼讀取資料執行緒擁有讀取指標,寫入資料線程擁有寫入指標,各自將訪問佇列中不同位置上的資料,因此不用進行互斥保護。

分析完畢後,再來考慮使用什麼樣的資料結構。使用兩個訊號量,乙個來記錄迴圈佇列中空位的個數,乙個來記錄迴圈佇列中產品的個數(非空位個數)。

**非常容易寫出,下面給出完整的源**。

#include #include #include #include #include#includeusing namespace std;

const int iqueue = 5;

int arrqueue[iqueue];

int iread, iwrite, icnt;

//關鍵段

critical_section csconsole;//互斥訪問控制台

//訊號量

handle hsemaphorequeueempty;//表示佇列中空位

handle hsemaphorequeuefull;//表示佇列中資料

//設定控制台輸出顏色

//setconsoletextattribute(getstdhandle(std_output_handle), foreground_red | foreground_green | foreground_blue);

//讀資料執行緒函式

uint winapi readerproc(pvoid pparam)

return 0;}

//寫資料線程函式

uint winapi writerproc(pvoid pparam)

return 0;}

//雙線程讀寫佇列資料

void trtw()

雙線程猜數字

用兩個執行緒玩猜數字遊戲,第乙個執行緒負責隨機給出1 100之間的乙個整數,第二個執行緒負責猜出這個數。要求每當第二個執行緒給出自己的猜測後,第乙個執行緒都會提示 猜小了 猜大了 或 猜對了 猜數之前,要求第二個執行緒要等待第乙個執行緒設定好要猜測的數。第乙個執行緒設定好猜測數之後,兩個執行緒還要相...

執行緒題 雙線程迴圈列印

主線程啟動兩個子執行緒,其中乙個連續列印b,另乙個連續列印e,兩個執行緒的列印輸出在同一行,要求列印出一行包括40個b和e相同的字串,bebebebe 實現 package test public class test204 else if s.equals e times catch except...

雙線程臨界區實現

windowsxp vc6環境下雙線程臨界區實現 include include include int threadflag 2 執行緒標誌 int door 進入標誌 long crtsec 0 衝突域 handle lock 訊號量 critical section cs int allnum...