亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

何時使用易失性與多線程?

何時使用易失性與多線程?

C++
白衣非少年 2019-06-28 17:02:41
如果有兩個線程訪問全局變量,那么許多教程都表示,使變量易失性,以防止編譯器將變量緩存在寄存器中,從而無法正確更新變量。但是,兩個線程都訪問共享變量是需要通過互斥保護的,不是嗎?但是在這種情況下,在線程鎖定和釋放互斥鎖之間,代碼處于一個關鍵部分,其中只有一個線程可以訪問變量,在這種情況下,變量不需要是易失性的?那么,在多線程程序中易失性的用途/用途是什么呢?何時使用易失性與多線程?
查看完整描述

3 回答

?
慕森王

TA貢獻1777條經驗 獲得超3個贊

易失性有時是有用的,原因如下:

/* global */ bool flag = false;while (!flag) {}

GCC優化如下:

if (!flag) { while (true) {} }

如果標志是由另一個線程寫入的,這顯然是不正確的。注意,如果沒有這種優化,同步機制可能會工作(取決于其他代碼,可能需要一些內存屏障)-在1個生產者-1個消費者場景中不需要互斥。

否則,易失性關鍵字太奇怪,無法使用-它不提供任何內存排序保證WRT的易失性和非易失性訪問,也不提供任何原子操作-也就是說,除了禁用寄存器緩存之外,您沒有從編譯器那里得到任何使用易失性關鍵字的幫助。


查看完整回答
反對 回復 2019-06-28
?
慕妹3146593

TA貢獻1820條經驗 獲得超9個贊

你需要變化無常也可能是鎖定。

易失性告訴優化器值可以異步更改,因此

volatile bool flag = false;while (!flag) {
    /*do something*/}

每次循環時都會讀取標志。

如果您關閉優化或使每個變量不穩定,程序的行為將相同,但速度較慢。易失性只意味著‘我知道你可能只讀了它,知道它說什么,但如果我說讀它,那就讀它。

鎖定是程序的一部分。因此,順便說一句,如果您正在實現信號量,那么除其他外,它們必須是不穩定的。(不要嘗試它,它很難,可能需要一個小的匯編程序或新的原子的東西,而且它已經做了。)


查看完整回答
反對 回復 2019-06-28
  • 3 回答
  • 0 關注
  • 378 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號