分享到:文章主題: X86 cpu是不是不會亂序執行,原子操作不用考慮memory order
water4樓主
water4
身份
用戶
文章
2957
星座
天蝎座
積分
41936
等級
沉香(10)

發信人: water4 (water4), 信區: CPlusPlus
標  題: X86 cpu是不是不會亂序執行,原子操作不用考慮memory order
發信站: 水木社區 (Sat Nov  9 07:50:43 2019), 站內
  
用relaxed模型也沒發現什么問題
--
  
※ 來源:·水木社區 http://www.yfccow.live·[FROM: 115.34.130.*]

返回頂部
Akyrum第1樓
人類に栄光あれ
身份
用戶
文章
448
星座
白羊座
積分
3967
等級
沉香(10)

發信人: Akyrum (人類に栄光あれ), 信區: CPlusPlus
標  題: Re: X86 cpu是不是不會亂序執行,原子操作不用考慮memory order
發信站: 水木社區 (Sat Nov  9 08:55:18 2019), 站內
  
會亂序執行
relaxed只是執行順序不定,依然是原子操作
比如多線程對一個atomic_int加加減減,用relaxed是不會出錯的,標準庫和背后的軟硬件系統保證了對這個atomic_int的任何操作都是原子的。至于背后咋實現的,我就不清楚了…
【 在 water4 (water4) 的大作中提到: 】
: 用relaxed模型也沒發現什么問題
  
--
  
※ 修改:·Akyrum 于 Nov  9 09:14:52 2019 修改本文·[FROM: 123.150.182.*]
※ 來源:·水木社區 http://newsmth.net·[FROM: 123.150.182.*]

返回頂部
z16166第2樓
z16166
身份
用戶
文章
4225
星座
魔羯座
積分
37541
等級
靈樨(8)

發信人: z16166 (z16166), 信區: CPlusPlus
標  題: Re: X86 cpu是不是不會亂序執行,原子操作不用考慮memory order
發信站: 水木社區 (Sat Nov  9 10:07:25 2019), 站內
  
x86 cpu不亂序執行的話,最近這兩年怎么報出來一堆cpu漏洞的?
--
  
※ 來源:·水木社區 http://www.yfccow.live·[FROM: 123.115.132.*]

返回頂部
poikilotherm第3樓
呆子
身份
用戶
文章
18546
星座
處女座
積分
55053
等級
紫檀(11)

發信人: poikilotherm (呆子), 信區: CPlusPlus
標  題: Re: X86 cpu是不是不會亂序執行,原子操作不用考慮memory order
發信站: 水木社區 (Sat Nov  9 10:17:33 2019), 站內
  
亂序有兩個層面,一個是編譯器優化可能重排指令,另一個是cpu會亂序執行指令  
    
【 在 water4 () 的大作中提到: 】
: 用relaxed模型也沒發現什么問題
--
發自xsmth (iOS版)
--
  
我扶著七萬多一平米房子陽臺的扶手抽著煙,思緒萬千,人活著究竟為了什么。錢?權?有錢有權之后呢?這時,身后走來一位美麗可人的少婦對我說:“師傅,這是你通廁所的費用兩百塊”。
  
※ 來源:·水木社區 http://m.newsmth.net·[FROM: 117.136.87.*]

返回頂部
water4第4樓
water4
身份
用戶
文章
2957
星座
天蝎座
積分
41936
等級
沉香(10)

發信人: water4 (water4), 信區: CPlusPlus
標  題: Re: X86 cpu是不是不會亂序執行,原子操作不用考慮memory order
發信站: 水木社區 (Sat Nov  9 12:06:51 2019), 站內
  
但是這段代碼用memory_order_relaxed跑了100萬次沒發現有什么問題,那acquire和release還有什么用?
  
  
#include <thread>
#include <atomic>
#include <cassert>
#include <vector>
#include <iostream>
  
int main() {
  
     int counter = 0;
     std::atomic_bool lock{false};
     std::vector<std::thread> threads(8);
  
     for (int i = 0; i < threads.size(); ++i) {
         threads[i] = std::move(std::thread([&counter, &lock] {
             int loops = 0;
             while (loops < 2000) {
                 bool expected = false;
                 if (lock.compare_exchange_strong(expected, true, std::memory_order_relaxed)) {
                     counter++;
                     lock.store(false, std::memory_order_relaxed);
                     loops++;
                 }
             }
         }));
     }
  
     for (auto &th : threads) {
         th.join();
     }
  
     std::cout << "final count: " << counter << std::endl;
  
     return 0;
}
【 在 Akyrum 的大作中提到: 】
: 會亂序執行
: relaxed只是執行順序不定,依然是原子操作
: 比如多線程對一個atomic_int加加減減,用relaxed是不會出錯的,標準庫和背后的軟硬件系統保證了對這個atomic_int的任何操作都是原子的。至于背后咋實現的,我就不清楚了…
  
--
※ 修改:·water4 于 Nov  9 12:07:25 2019 修改本文·[FROM: 115.34.130.*]
※ 來源:·水木社區 http://www.yfccow.live·[FROM: 115.34.130.*]

返回頂部
hongdiao第5樓
hongdiao
身份
用戶
文章
1413
星座
獅子座
積分
26304
等級
沉香(10)

發信人: hongdiao (hongdiao), 信區: CPlusPlus
標  題: Re: X86 cpu是不是不會亂序執行,原子操作不用考慮memory order
發信站: 水木社區 (Sat Nov  9 12:21:28 2019), 站內
  
X86是強順序的。memory_order如同樓上所說,存在編譯器和CPU指令執行兩個層面。
--
※ 修改:·hongdiao 于 Nov  9 12:21:49 2019 修改本文·[FROM: 1.91.32.*]
※ 來源:·水木社區 http://www.yfccow.live·[FROM: 1.91.32.*]

返回頂部
beanpole第6樓
咊 期待在春天里
身份
用戶
文章
6131
積分
44967
等級
椽桷(13)

發信人: beanpole (咊 期待在春天里), 信區: CPlusPlus
標  題: Re: X86 cpu是不是不會亂序執行,原子操作不用考慮memory order
發信站: 水木社區 (Sat Nov  9 12:50:39 2019), 站內
  
586時代就會玩亂序,預測分支操作了
【 在 water4 的大作中提到: 】
: 用relaxed模型也沒發現什么問題
  
--
  
※ 來源:·水木社區 http://www.yfccow.live·[FROM: 171.104.23.*]

返回頂部
telangpujing第7樓
telangpujing
身份
用戶
文章
901
星座
未知
積分
21929
等級
靈樨(8)

發信人: telangpujing (telangpujing), 信區: CPlusPlus
標  題: Re: X86 cpu是不是不會亂序執行,原子操作不用考慮memory order
發信站: 水木社區 (Sat Nov  9 13:06:30 2019), 站內
  
就是說x86程序原子同步用任何內存序都不會出問題?
  
【 在 hongdiao 的大作中提到: 】
: X86是強順序的。memory_order如同樓上所說,存在編譯器和CPU指令執行兩個層面。
  
--
  
※ 來源:·水木社區 http://www.yfccow.live·[FROM: 106.121.163.*]

返回頂部
z16166第8樓
z16166
身份
用戶
文章
4225
星座
魔羯座
積分
37541
等級
靈樨(8)

發信人: z16166 (z16166), 信區: CPlusPlus
標  題: Re: X86 cpu是不是不會亂序執行,原子操作不用考慮memory order
發信站: 水木社區 (Sat Nov  9 13:28:40 2019), 站內
  
compare_exchange_strong/compare_exchange_weak本身是原子操作
  
http://www.cplusplus.com/reference/atomic/atomic/compare_exchange_strong/
  
  But the entire operation is atomic: the value cannot be modified by other threads between the instant its value is read and the moment it is replaced.
--
  
※ 來源:·水木社區 http://www.yfccow.live·[FROM: 123.115.132.*]

返回頂部
Akyrum第9樓
人類に栄光あれ
身份
用戶
文章
448
星座
白羊座
積分
3967
等級
沉香(10)

發信人: Akyrum (人類に栄光あれ), 信區: CPlusPlus
標  題: Re: X86 cpu是不是不會亂序執行,原子操作不用考慮memory order
發信站: 水木社區 (Sat Nov  9 13:46:26 2019), 站內
  
這是要試驗出counter計數錯誤嗎?確實小概率且難以復現錯誤的實驗
人為亂個序看看
bool expected = false;
auto cc=counter;
cc+=1;
...線程0幾萬條空指令,線程2十幾萬條空指令,依次每線程都插不同長度的空指令....
if (lock.compare_exchange_strong(expected, true, std::memory_order_relaxed)) {
counter=cc;
lock.store(false, std::memory_order_relaxed);
【 在 water4 (water4) 的大作中提到: 】
: 但是這段代碼用memory_order_relaxed跑了100萬次沒發現有什么問題,那acquire和release還有什么用?
: #include <thread>
: #include <atomic>
: ...................
  
--
  
※ 修改:·Akyrum 于 Nov  9 14:29:28 2019 修改本文·[FROM: 219.133.46.*]
※ 來源:·水木社區 http://newsmth.net·[FROM: 123.150.182.*]

返回頂部
  • 文章數:23 分頁:
    1. 1
    2. 2
    3. 3
    4. >>
今天河南快3开奖结果