我有一根线,基本上是:
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)。