程式設計思路
程序同步分析
從讀者角度看
針對寫者的資料生成執行緒
.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...