C 多執行緒學習筆記(6) 讀者 寫者問題模擬

2021-10-07 05:54:47 字數 4148 閱讀 8789

程式設計思路

程序同步分析

從讀者角度看

針對寫者的資料生成執行緒

.join()方法

互斥量mutex

this_thread命名空間 其他

//用lock類同時鎖倆訊號量

std::

lock

(my_mutex1, my_mutex2)

;//用lock_guard物件來unlock,adopt_lock用來避免重複lock

std::lock_guard

threadguard1

(my_mutex1, std::adopt_lock)

; std::lock_guard

threadguard2

(my_mutex2, std::adopt_lock)

;

//讀者寫者問題,請在release狀態下執行,因為debug狀態要求執行緒a進行的lock必須由執行緒a來unlock,

//而讀者寫者問題中,某個讀者對寫互斥量的lock可能是由其他讀者unlock的。如果在debug狀態執行,會報錯unlock of unowned mutex(stl::mutex)

#include

"pch.h"

//vs2017自帶的空編譯頭

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace std;

//寫者類

class

writer

//關聯寫執行緒

void

setthread

(thread *p)

//設定子執行緒為join方式

void

join()

//生成寫者的資料,十個隨機大寫字母

void

gendata()

}//獲取寫者資料

string getdata()

};//讀者-寫者 臨界資源類

class

criticalresource

//寫執行緒

void

write

(writer *w)

}//讀執行緒

void

read()

}};int

main()

//建立5個讀執行緒,子執行緒入口是criticalresource類函式read

for(

int i =

0; i <

5; i++

) readerthreads.

push_back

(std::

thread

(&criticalresource::read,

&cr));

//所有執行緒都設定成join模式,主線程要等待子執行緒結束才能退出,防止主線程提前退出

for(

auto iter = readerthreads.

begin()

; iter != readerthreads.

end();

++iter)

iter-

>

join()

;for

(int i =

0; i <

2; i++

) w[i]

.join()

;return0;

}

寫者2604寫入:wpiactwnou--

----

----

----

----

----

----

----

----

寫者26320寫入:jfrpiaizxx--

----

----

----

----

----

----

----

----

讀者27172讀取:jfrpiaizxx,當前有3個讀者正在訪問

讀者28956讀取:jfrpiaizxx,當前有2個讀者正在訪問

讀者27504讀取:jfrpiaizxx,當前有1個讀者正在訪問

讀者1512讀取:jfrpiaizxx,當前有2個讀者正在訪問

讀者32716讀取:jfrpiaizxx,當前有1個讀者正在訪問

寫者2604寫入:lxpniqlohb--

----

----

----

----

----

----

----

----

寫者26320寫入:yaztwltigl--

----

----

----

----

----

----

----

----

讀者28956讀取:yaztwltigl,當前有1個讀者正在訪問

讀者27172讀取:讀者27504讀取:yaztwltigl,當前有2個讀者正在訪問

yaztwltigl,當前有1個讀者正在訪問

讀者1512讀取:yaztwltigl,當前有2個讀者正在訪問

讀者32716讀取:yaztwltigl,當前有1個讀者正在訪問

寫者2604寫入:ktlxojfamf--

----

----

----

----

----

----

----

----

讀者28956讀取:ktlxojfamf,當前有1個讀者正在訪問

讀者27504讀取:ktlxojfamf,當前有2個讀者正在訪問

讀者27172讀取:ktlxojfamf,當前有1個讀者正在訪問

寫者26320寫入:gtcwchifon--

----

----

----

----

----

----

----

----

寫者2604寫入:wzhlshrwfh--

----

----

----

----

----

----

----

----

讀者1512讀取:wzhlshrwfh,當前有2個讀者正在訪問讀者28956讀取:wzhlshrwfh,當前有5個讀者正在訪問

讀者32716讀取:wzhlshrwfh,當前有3個讀者正在訪問

讀者27172讀取:wzhlshrwfh,當前有2個讀者正在訪問

讀者27504讀取:wzhlshrwfh,當前有1個讀者正在訪問

寫者26320寫入:zefctzrydq--

----

----

----

----

----

----

----

----

寫者2604寫入:rzatxqkcbk--

----

----

----

----

----

----

----

----

讀者讀者28956讀取:rzatxqkcbk,當前有5個讀者正在訪問

1512讀取:rzatxqkcbk,當前有4個讀者正在訪問

讀者27172讀取:rzatxqkcbk,當前有3個讀者正在訪問

讀者27504讀取:rzatxqkcbk,當前有2個讀者正在訪問

讀者32716讀取:rzatxqkcbk,當前有1個讀者正在訪問

寫者26320寫入:tflbuplstf--

----

----

----

----

----

----

----

----

讀者1512讀取:tflbuplstf,當前有2個讀者正在訪問

讀者32716讀取:tflbuplstf,當前有1個讀者正在訪問

多執行緒的讀者寫者問題

上面是讀者寫者問題示意圖,類似於生產者消費者問題的分析過程,首先來找找哪些是屬於 等待 情況。第一 寫者要等到沒有讀者時才能去寫檔案。第二 所有讀者要等待寫者完成寫檔案後才能去讀檔案。vc 控制台顏色設定 因此在這裡要加個互斥訪問,不然很有可能在寫者執行緒將控制台顏色設定還原之前,讀者執行緒就已經有...

多執行緒11 讀者寫者問題

秒殺多執行緒第十篇 生產者消費者問題 的生產者消費者問題一樣,讀者寫者也是乙個非常著名的同步問題。讀者寫者問題描述非常簡單,有乙個寫者很多讀者,多個讀者可以同時讀檔案,但寫者在寫檔案時不允許有讀者在讀檔案,同樣有讀者在讀檔案時寫者也不去能寫檔案。上面是讀者寫者問題示意圖,類似於生產者消費者問題的分析...

多執行緒同步之讀者寫者問題

問題定義 現有一塊共享記憶體,多個讀程序和多個寫程序。多個讀程序可以同時讀,但是當有乙個寫程序正在寫時,其他任何讀程序或寫程序都不能執行。該問題有3種變種。第一種稱為 讀者優先 readers preference 在此情況下,只要有程序在讀,寫程序就得等待。實現如下 include include...