【发布时间】:2014-08-29 10:03:24
【问题描述】:
我有一个基本上可以做到的线程:
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%,值得追求。
然而 volatile 变量似乎被严重劝阻。 这里的方法有什么缺点吗?任何可能导致 2. 版本无法按预期工作的极端情况?
【问题讨论】:
-
你确定性能提升是因为使用
volatile而不是因为do_stuff()(或代码的其他部分)在不同的运行中做不同的事情吗? -
如果循环只由一个线程运行是好的,如果不是,重新检查锁定后的值。考虑改用 std::atomic_flag。
-
@KingsIndian 是的,我很确定。
-
是否需要在保持互斥锁锁定的同时调用
do_changes? -
@MaximYegorushkin 是的。