При написании программ на C, которым необходимо совместно использовать переменную области файла между приложением и подпрограммой прерывания / потоком / подпрограммой обратного вызова, хорошо известно, что переменная должна быть объявлена как volatile, иначе компилятор может сделать неверный оптимизаций. Это пример того, что я имею в виду:
int flag;
void some_interrupt (void)
{
flag = 1;
}
int main()
{
flag = 0;
...
/* <-- interrupt occurs here */
x = flag; /* BUG: the compiler doesn't realize that "flag" was changed
and sets x to 0 even though flag==1 */
}
Чтобы предотвратить вышеуказанную ошибку, «flag» должен был быть объявлен как volatile.
Мой вопрос: как это применимо к C ++ при создании класса, содержащего поток?
У меня есть класс, который выглядит примерно так:
class My_thread
{
private:
int flag;
static void thread_func (void* some_arg) // thread callback function
{
My_thread* this_ptr= (My_thread*)some_arg;
}
};
«some_arg» будет содержать указатель на экземпляр класса, так что каждый объект «My_thread» имеет свой собственный поток. Через этот указатель он получит доступ к переменным-членам.
Значит ли это, что this_ptr должен быть объявлен как указатель на изменчивые данные? Должен ли "флаг" быть волатильным? И если да, должен ли я сделать все функции-члены, изменяющие флаг, изменчивыми?
Меня не интересует, как ведет себя конкретная ОС или компилятор, я ищу универсальное, полностью переносимое решение.
РЕДАКТИРОВАТЬ: Этот вопрос не имеет ничего общего с безопасностью потоков!
В реальном коде будут семафоры и т. Д.
Чтобы уточнить, я хочу избежать ошибок, вызванных неосведомленностью компилятора о том, что функция обратного вызова может вызываться из источников вне самой программы, и поэтому делать неверные выводы о том, использовались ли определенные переменные или нет. Я знаю, как сделать это в C, как показано в первом примере, но не в C ++.