这里是使用条件变量的典型方式:如果您要自动更改选中的值,条件变量是否仍然需要互斥锁?
// The reader(s)
lock(some_mutex);
if(protected_by_mutex_var != desired_value)
some_condition.wait(some_mutex);
unlock(some_mutex);
// The writer
lock(some_mutex);
protected_by_mutex_var = desired_value;
unlock(some_mutex);
some_condition.notify_all();
但如果protected_by_mutex_var被设置原子比方说,一个比较并交换指令,并互斥任何目的(比并行线程等其他API需要你传递一个互斥体)?它是用来保护状态的吗?如果不是,那么这样做是否安全?:
// The writer
atomic_set(protected_by_mutex_var, desired_value);
some_condition.notify_all();
作者从来没有直接与读者的互斥体进行交互?请注意,'protected_by_mutex_var'这个名字已经不再适合了(它不再受mutex保护)。如果是这样,甚至有必要让不同的读者使用相同的互斥量?
条件变量的整点是他们让“检查谓词,解锁互斥体,和睡眠“原子。 – 2011-08-28 12:17:13