Недавно я встретил любопытное использование ключевого слова volatile в многопоточном коде С++. Чтобы отвлечь шаблон программирования, предположим, что есть объект управления, к которому обращается один производитель и несколько потребительских потоков:
class control_t {
pthread_mutex_t control_lock;
pthread_cond_t wake_cond;
bool there_is_work_todo;
control_t volatile* vthis() { return this; }
}
Потребительский поток выполняет следующие действия (c является энергонезависимым указателем на объект управления):
...
pthread_mutex_lock(c->control_lock)
while (!c->vthis()->there_is_work_todo) {
pthread_cond_wait(&c->wake_cond, &c->control_lock);
}
...
Идея здесь в том, что потребительские потоки будут ждать, пока не будет выполнена какая-то работа, которую производитель сигнализирует через переменную wake_cond.
То, что я не понимаю здесь, - это то, почему доступ к объекту управления осуществляется с помощью летучего указателя на "this", который возвращается методом vthis(). Почему это?