彙編下call和ret指令是否有記憶體屏障的作用?

時間 2021-05-07 13:02:46

1樓:王東嶽

抖個機靈:

其實某些情況下是成立的

new呼叫malloc,malloc一些實現中會有spinlock,對應的就有memfence

當然啦最重要的還是memfence

2樓:劉生

new 乙個物件一般會幹兩件事,第一是在堆上分配記憶體,第二,呼叫類的建構函式。如你所見,this指標,這裡相當於剛分配好的記憶體位址,會作為引數傳給建構函式。呼叫成員函式一般都會通過ecx傳this指標。

這兩步裡第一步是執行緒安全的,也就是說,不會因為兩個執行緒同時向堆管理器申請記憶體,而破壞堆結構。

第二步,我也不確定,因為建構函式通常用來初始化本物件裡的成員變數,物件之間本來就沒有共享的部分,都是操作各自的東西,不存在競爭,也就很少需要考慮這種問題。

但是我們也可以做乙個假設,我們在建構函式裡訪問乙個全域性指標變數,修改它的內容,我想它可能是不安全的。 這麼幹應該也是不該提倡的。

還有一種操作,我好像做過,就是宣告乙個靜態類成員變數,統計該類生成了多少物件。 在建構函式裡對這個變數做++操作,但是我如果真這麼做,通常會呼叫windows的interlock函式,實現對該變數的原子操作,在別的平台上也會考慮用別的方式加鎖。

3樓:暮無井見鈴

new 依賴底層的 ::operator new 函式,這裡我假設你不會替換它。

預設的 operator new 函式會使用乙個記錄動態記憶體的狀態(俗稱「堆」),從中申請出記憶體塊。

new 的執行緒安全指的是 operator new 在每次分配時對堆狀態(或者其需要從多個執行緒訪問的部分)的讀寫是同步的,保證不讓不同執行緒同時訪問堆狀態(的該部分),從而避免不同執行緒發生的分配產生錯誤。

4樓:

19-11-07

一開始,我從網上查資料說new是執行緒安全的,所以,我從vs2019的彙編上去倒推,從而產生了call和ret指令必須具備記憶體屏障的作用,new的執行緒安全才成立。但是,從各位大牛的回答上來說,並沒有給出call和ret指令必須具備記憶體屏障的邏輯相關性。

只檢查複雜物件指標是否為null來實現double check的邏輯存在條件競爭,本身就是執行緒不安全的。

5樓:望山

似乎沒有這個說法。題主可以查一下Intel的指令手冊。我覺得從CPU設計的角度看,函式呼叫和返回是單個核心自己的事情,沒理由去擔心多核之間的問題,所以不應該在這裡浪費資源針對多核記憶體衝突進行特殊處理。

6樓:悽臨雨

題主主要是關心 p = new X()時的多執行緒安全問題吧。

我在研究這的時候突然想到申請一片記憶體,在上面呼叫建構函式,並返回給p後

另乙個執行緒讀取p,並將要讀取p時,假設*p所在的cacheline已經在此執行緒的cpu中,而且用的是弱一致性CPU,那這個可見性問題就值得疑惑了。也就是如果c++沒有給建構函式末尾加release語義,那第二個執行緒說不定讀取*p會返回*p記憶體上的舊值而不是最新值?

好在這個問題在x86上不存在,主要就是關心android和ios機器上會不會有問題

如何看待劇場毒瘤call和厄介call?

不止部分劇場黨反感,作為乙個常蹲直播的小粉絲,也不喜歡。全程喊call很吵,以前的call很合適,還是歌舞為主,call是輔助和點綴,現在覺得這種全程call有些地方是強行call,已經影響到正常欣賞歌舞了。近幾場開始,特別是x隊公演,部分歌曲已經換成厄介call了,個人對於厄介call的蔓延持悲觀...

Adidas的boost和Nike的react哪個價效比更高?腳感更好?

牧瑾 我都有react的是nike zoom fly fkboost的是ub19 差不多都是這兩個材料最好的鞋了,就我個人的體驗來說,boost價效比更高,雖然boost稍貴,但耐久更好,好好穿,兩三年應該都能穿的下來。腳感與大部分人感受不同的是,也有可能是我的是zoom fly fk的原因 中底很...

對SNH48公演中MIX和call的一些疑問?

1.成員介紹完catch phrase後的call,應援會的統一組織有沒有其必要性?怎麼看待毒瘤call的存在?有必要。其實沒有毒瘤call是墜吼的,但是禁不住。不如統一一下免得沒完沒了call個沒夠 2.爆裂mix,有人認為拉爆裂不是akb的mix,有的認為這樣有氣勢,有的認為 烏拉嘿 喊不齊,拉...