我有一根线,基本上是:

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不会使变量线程安全或原子化。你可以用C11 atomics来做。
您基本上有两个线程更改了changed变量,从而覆盖了导致数据竞争的先前值。
我建议你不要看太多。(它也适用于C)。

10-07 22:36