1 2執行緒中,無競爭的原子操作的效能

2021-10-23 06:53:56 字數 2740 閱讀 9774

#include

#include

enum

;union

;union

;union

;for

(int j =

0; j <10;

++j)})

.detach()

;}else

if(j ==6)

//第6+1輪再開啟乙個讀執行緒讀b})

.detach()

;}t =

gettickcount()

- t;

printf

("同乙個變數 = %dm組/s, *1=%dm/s\n"

, count / t /

1000,1

* count / t /

1000);

} t =

gettickcount()

- t;

printf

("同乙個變數 = %dm組/s, *2=%dm/s\n"

, count / t /

1000,2

* count / t /

1000);

} t =

gettickcount()

- t;

printf

("不同cacheline變數 = %dm組/s, *2=%dm/s\n"

, count / t /

1000,2

* count / t /

1000);

} t =

gettickcount()

- t;

printf

("不同cacheline變數 = %dm組/s, *3=%dm/s\n"

, count / t /

1000,3

* count / t /

1000);

}puts(""

);}

同乙個變數 = 150m組/s, *1=150m/s

同乙個變數 = 75m組/s, *2=150m/s

不同cacheline變數 = 88m組/s, *2=176m/s

不同cacheline變數 = 49m組/s, *3=147m/s

同乙個變數 = 160m組/s, *1=160m/s

同乙個變數 = 77m組/s, *2=155m/s

不同cacheline變數 = 88m組/s, *2=176m/s

不同cacheline變數 = 49m組/s, *3=147m/s

同乙個變數 = 160m組/s, *1=160m/s

同乙個變數 = 77m組/s, *2=155m/s

不同cacheline變數 = 91m組/s, *2=183m/s

不同cacheline變數 = 49m組/s, *3=147m/s

以下開啟執行緒 read a-------------------

同乙個變數 = 121m組/s, *1=121m/s

同乙個變數 = 64m組/s, *2=128m/s

不同cacheline變數 = 71m組/s, *2=142m/s

不同cacheline變數 = 39m組/s, *3=118m/s

同乙個變數 = 128m組/s, *1=128m/s

同乙個變數 = 61m組/s, *2=122m/s

不同cacheline變數 = 71m組/s, *2=142m/s

不同cacheline變數 = 41m組/s, *3=124m/s

同乙個變數 = 121m組/s, *1=121m/s

同乙個變數 = 61m組/s, *2=122m/s

不同cacheline變數 = 73m組/s, *2=146m/s

不同cacheline變數 = 41m組/s, *3=124m/s

以下開啟執行緒 read b-------------------

同乙個變數 = 121m組/s, *1=121m/s

同乙個變數 = 64m組/s, *2=128m/s

不同cacheline變數 = 64m組/s, *2=128m/s

不同cacheline變數 = 37m組/s, *3=111m/s

同乙個變數 = 128m組/s, *1=128m/s

同乙個變數 = 62m組/s, *2=125m/s

不同cacheline變數 = 64m組/s, *2=128m/s

不同cacheline變數 = 36m組/s, *3=108m/s

同乙個變數 = 121m組/s, *1=121m/s

同乙個變數 = 64m組/s, *2=128m/s

不同cacheline變數 = 64m組/s, *2=128m/s

不同cacheline變數 = 37m組/s, *3=111m/s

同乙個變數 = 121m組/s, *1=121m/s

同乙個變數 = 62m組/s, *2=125m/s

不同cacheline變數 = 64m組/s, *2=128m/s

不同cacheline變數 = 34m組/s, *3=103m/s

此外,此測試程序,開兩份時與乙份幾乎無差異,開三份時數字也有乙份的2/3以上。

多執行緒 x y的原子性

所謂的原子性是指該操作不能再繼續劃分為更小的操作,在多執行緒中原子操作是乙個很重要的概念,決定了該操作是否需要同步機制來進行保護。在x86中,x y包含兩個操作 讀取y至暫存器,然後將該值寫入x,其中讀取y的值至暫存器中是原子的,將值寫入x也是原子的,但是這裡需要格外注意的是兩個原子操作的組合不一定...

執行緒的原子性類的例項

很多人問像atomicinteger類是在哪個方面使用的?public class threaddemo catch interruptedexception e for int j 0 j 100 j start try catch interruptedexception e 大家覺得輸出的是什...

執行緒的原子性與可見性

同步最基本的目的是保證原子性。另乙個容易忽略的目的是可見性,即乙個執行緒修改的共享資料對另乙個執行緒可見。因為一些基本型別的賦值操作本身是原子的。所以針對這些賦值操作在不使用synchronized的情況下,可以使用volatile來解決乙個執行緒的修改對另乙個執行緒的可見。所以volatile是在...