第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

何時(shí)使用易失性與多線程?

何時(shí)使用易失性與多線程?

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

3 回答

?
慕森王

TA貢獻(xiàn)1777條經(jīng)驗(yàn) 獲得超3個(gè)贊

易失性有時(shí)是有用的,原因如下:

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

GCC優(yōu)化如下:

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

如果標(biāo)志是由另一個(gè)線程寫(xiě)入的,這顯然是不正確的。注意,如果沒(méi)有這種優(yōu)化,同步機(jī)制可能會(huì)工作(取決于其他代碼,可能需要一些內(nèi)存屏障)-在1個(gè)生產(chǎn)者-1個(gè)消費(fèi)者場(chǎng)景中不需要互斥。

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


查看完整回答
反對(duì) 回復(fù) 2019-06-28
?
慕妹3146593

TA貢獻(xiàn)1820條經(jīng)驗(yàn) 獲得超9個(gè)贊

你需要變化無(wú)常也可能是鎖定。

易失性告訴優(yōu)化器值可以異步更改,因此

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

每次循環(huán)時(shí)都會(huì)讀取標(biāo)志。

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

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


查看完整回答
反對(duì) 回復(fù) 2019-06-28
  • 3 回答
  • 0 關(guān)注
  • 383 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)