РЕДАКТИРОВАЛ и уточнил мой вопрос после ценного ответа Йоханнеса
bool b = true;
volatile bool vb = true;
void f1() { }
void f2() { b = false; }
void(* volatile pf)() = &f1; //a volatile pointer to function
int main()
{
//different threads start here, some of which may change pf
while(b && vb)
{
pf();
}
}
Итак, давайте на время забудем о синхронизации. Вопрос в том, следует ли объявить b изменчивым. Я прочитал стандартное и вроде как знаю формальное определение изменчивой семантики (я даже почти понимаю их, слово почти является ключевым). Но давайте будем здесь немного неформально. Если компилятор видит, что в цикле нет возможности изменить b, тогда, если b не является изменчивым, он может оптимизировать его и предположить, что он эквивалентен while (vb)
. Вопрос в том, что в этом случае pf сам по себе является изменчивым, поэтому компилятор может предположить, что b выиграл '
Комментарии и ответы, которые, помимо ответа на мой вопрос, также затрагивают семантику volatile более подробно, что, по вашему мнению, я неправильно понял, очень приветствуются.
Надеюсь, мой вопрос ясен. TIA
Еще раз редактирование:
что насчет этого?
bool b = true;
volatile bool vb = true;
void f1() {}
void f2() {b = false;}
void (*pf) () = &f1;
#include <iosrteam>
int main()
{
//threads here
while(b && vb)
{
int x;
std::cin >> x;
if(x == 0)
pf = &f1;
else
pf = &f2;
pf();
}
}
Есть ли принципиальная разница между двумя программами. Если да, то в чем разница?