C_and_CPP 板


LINE

開發平台(Platform): (Ex: Win10, Linux, ...) Win10/Linux 編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出) GCC 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) None 問題(Question): 最近在使用C++11的std::thread,我已經知道若要在不同的thread存取同一個變數, 必須使用mutex來做管理才能達到Thread-Safe。 目前遇到的問題是,若我有多個不同的變數分別必須在多個不同的thread內存取,我 除了變數名稱外,還必須一一產生對應的mutex,我想建立下列這樣的樣板類別: template <class T> class SharedVariable { private: std::mutex mtx; T data; public: T Get(void) { T data_cpy; std::lock_guard<std::mutex> lck(mtx); data_cpy = this->data; return data_cpy; } void Set(const T data) { std::lock_guard<std::mutex> lck(mtx); this->data = data; } }; 在產生變數物件的同時,該物件也同時具有一個不用額外命名的mutex,並且當我 透過Get/Set存取變數時,也自動做好了上鎖、解鎖的功能。 SharedVariable<int> shared_int; SharedVariable<std::string> shared_string; SharedVariable<std::vector<double>> shared_vector; shared_int.Set(123); int a = shared_int.Get(); 目前比較讓我有疑慮的是,在不同的thread內使用物件本身(如上例的shared_int、 shared_string、shared_vector)是一個Thread-Safe的行為嗎?我不確定要如何判 斷,想請有經驗的先進指教。 謝謝。 餵入的資料(Input): None 預期的正確結果(Expected Output): None 錯誤結果(Wrong Output): None 程式碼(Code):(請善用置底文網頁, 記得排版,禁止使用圖檔) None 補充說明(Supplement): --



※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 118.169.91.49 (臺灣)
※ 文章網址: https://webptt.com/m.aspx?n=bbs/C_and_CPP/M.1587997603.A.BCE.html
1F:→ loveme00835: 或者你應該思考的是: 為什麼多個執行緒都可以去更改 04/27 23:43
2F:→ loveme00835: 同個物件的狀態, 而不是讓單個專責的執行緒來做呢? 04/27 23:43
3F:→ loveme00835: 可以參考看看 active object pattern 把兩者先鬆綁 04/27 23:43
4F:→ icetofux: 我的程式由9個thread構成,8個各自跑不同的流程,透過so 04/28 07:45
5F:→ icetofux: cket與不同設備通訊,1個負責GUI,把8個設備的細部資料 04/28 07:45
6F:→ icetofux: 顯示出來,每個設備約有60多種的細部資料。文中所提在th 04/28 07:45
7F:→ icetofux: read間共用的變數就是設備傳輸至GUI的細部資料。 04/28 07:45
8F:→ icetofux: 謝謝loveme00835,我剛剛google了active object pattern 04/28 09:01
9F:→ icetofux: ,好像就是用來避免大量mutex的設計模式,雖然沒把握馬 04/28 09:01
10F:→ icetofux: 上帶入應用,但是一個可以努力的方向。 04/28 09:01
11F:推 eye5002003: 這情況不是用std::atomic比較適合嗎? 04/28 09:47
以我對atomic的認識,似乎只有幾種基本型態有提供atomic,我不是很確定像是string或是vector能不能使用。
12F:→ Lipraxde: 一般不是保護 critical section 嗎?每個變數都給一個 04/28 11:56
13F:→ Lipraxde: mute lock 好像比較少看到 04/28 11:56
14F:→ Lipraxde: mute -> mutex 04/28 11:56
15F:→ kobe8112: 如果改成各設備更新的資料丟到各自的queue中,UI更新的 04/28 11:59
16F:→ kobe8112: Thread輪詢各queue是否有資料需更新呢? 04/28 12:00
※ 編輯: icetofux (111.71.40.212 臺灣), 04/28/2020 12:52:59
17F:→ sarafciel: https://ideone.com/wHfCXi 拿你的模板寫了一小段 04/28 13:53
18F:→ sarafciel: 應該很容易看出問題才是 04/28 13:54
19F:推 steak5566: 可以請樓上大大可以解說一下為什麼嗎 04/28 22:55
20F:→ Caesar08: sarafciel的strt_flag型態要改成atomic<bool> 04/29 13:37
21F:→ Caesar08: 另外,func與func2不相等,func保護的是整段過程 04/29 13:38
22F:→ Caesar08: func2只保護每次sv_int的read write 04/29 13:38
23F:→ Caesar08: 結果不一樣是正常的 04/29 13:38
24F:→ Caesar08: 你的Get直接return data_cpy就好,不用先create再copy 04/29 13:40
25F:→ Caesar08: 另外有支援C++ 17的話,用shared_mutex會比mutex好 04/29 13:41
26F:推 steve1012: 不是有鎖住就好 還要看你想保護的東西是什麼 比如說你 04/29 14:04
27F:→ steve1012: 各個function 之間有沒有什麼順序先後需要保證的 04/29 14:04
28F:→ steve1012: muli threading 寫的越簡單通常越好 容易看出有沒有問 04/29 14:04
29F:→ steve1012: 題 04/29 14:04
30F:推 ucrxzero: 嗯嗯 04/30 18:11







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:BabyMother站內搜尋

TOP