15

以下是使用条件变量的典型方法:

// 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 是通过比较和交换指令原子设置的,那么互斥锁是否有任何用途(除了 pthread 和其他 API 要求您传入互斥锁)?是用来实现条件的保护状态吗?如果不是,那么这样做是否安全?:

// The writer
atomic_set(protected_by_mutex_var, desired_value);
some_condition.notify_all();

作者从不直接与读者的互斥锁交互?请注意,“protected_by_mutex_var”名称不再合适(不再受互斥保护)。如果是这样,不同的读者是否有必要使用相同的互斥锁?

4

1 回答 1

14

想象以下场景:

| Thread 1                                            | Thread 2                                           |
| if(protected_by_mutex_var != desired_value) -> true |                                                    |
|                                                     | atomic_set(protected_by_mutex_var, desired_value); |
|                                                     | some_condition.notify_all();                       |
| some_condition.wait(some_mutex);                    |                                                    |

在这种情况下,线程 1 正在等待可能永远不会到来的通知。因为作用于条件的语句不是变量 read / atomic set 的一部分,所以这提出了一个竞争条件。

有效地使用互斥锁使这些操作不可分割(假设对变量的所有访问行为正常并锁定互斥锁。)

于 2010-03-27T23:55:51.457 回答