我有一個線程,基本上做:volatile變量而不是互斥鎖變量來檢查改變的數據
int changed; //global variable
..
for (;;) {
pthread_mutex_lock(&mtx);
if (changed) {
do_changes();
changed = 0;
}
pthread_mutex_unlock(&mtx);
do_stuff();
}
循環運行了幾十萬次的速率,而全球changed
變量將設置很少(一天幾次)由另一個線程。
有了改變
volatile int changed; //global variable
..
for (;;) {
if (changed) {
pthread_mutex_lock(&mtx);
do_changes();
changed = 0;
pthread_mutex_unlock(&mtx);
}
do_stuff();
}
我可以衡量這種方法,同時追求其價值循環的3-4%的性能提升。
然而,揮發性變量似乎非常令人沮喪。 這裏的方法有什麼缺點嗎?任何可能導致2.版本無法按預期工作的角落案例?
您確定性能增加是因爲使用volatile而不是因爲do_stuff()(或其他代碼部分)在不同的運行中做了不同的事情嗎? – 2014-08-29 10:17:02
如果循環僅由一個線程運行,則不會重新檢查鎖定後的值。考慮使用std :: atomic_flag來代替。 – firda 2014-08-29 10:21:08
@KingsIndian是的,我確信這一點。 – user1255770 2014-08-29 10:52:09