Здесь требуется volatile?

РЕДАКТИРОВАЛ и уточнил мой вопрос после ценного ответа Йоханнеса

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

Есть ли принципиальная разница между двумя программами. Если да, то в чем разница?

5
задан Armen Tsirunyan 16 October 2010 в 18:16
поделиться