As variáveis de condição ainda precisam de um mutex se você estiver alterando o valor verificado atomicamente?

Aqui está a maneira típica de usar uma variável de condição:

// 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();

Mas se protected_by_mutex_var é definido atomicamente por, digamos, uma instrução de comparação e troca, o mutex serve a algum propósito (exceto que pthreads e outras APIs exigem que você transmita um mutex)? É o estado de proteção usado para implementar a condição? Caso contrário, é seguro fazer isso ?:

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

Com o escritor nunca interagindo diretamente com o mutex do leitor? Observe que o nome 'protected_by_mutex_var' não é mais realmente apropriado (não é mais protegido por mutex). Nesse caso, é necessário que leitores diferentes usem o mesmo mutex?

questionAnswers(1)

yourAnswerToTheQuestion