В общем случае, даже если многопоточность не была задействована и ваш цикл выглядел следующим образом:
void check_flag(foo_t* f) {
while(f->flag)
foo(&f->c, &f->m);
}
, компилятор не сможет кэшировать тест f->flag
.Это потому, что компилятор не может знать, может ли функция (например, foo()
выше) изменить любой объект, на который указывает f
.
При особых обстоятельствах (foo()
виден компилятору,и все указатели, переданные в check_flag()
, как известно, не являются псевдонимами или иным образом модифицируемыми foo()
), компилятор может оптимизировать проверку.
Однако pthread_cond_wait()
должен быть реализован таким образом, чтобыэто предотвратит эту оптимизацию.
См. Гарантирует ли защита переменной с помощью мьютекса pthread, что она также не кэшируется? :
Возможно, вас также заинтересует ответ Стива Джессопа на: Может ли компилятор C / C ++ легально кэшировать переменную в регистре при вызове библиотеки pthread?
Но как далеко вы хотите заняться проблемами, поднятыми в статье Бёма, в своей работе?вам решать.Насколько я могу судить, если вы хотите принять точку зрения, что pthreads не дает / не может дать гарантию, то вы, в сущности, занимаетесь тем, что pthreads бесполезна (или, по крайней мере, не дает никаких гарантий безопасности, чтоЯ думаю, что сокращение имеет тот же результат).Хотя это может быть правдой в самом строгом смысле (как указано в документе), это также, вероятно, не является полезным ответом.Я не уверен, какой вариант у вас будет, кроме pthreads на Unix-платформах.