В многопоточном приложении могут ли потоки 2+ обращаться к одной и той же функции, если функция не изменяет / считывает данные или изменяет / считывает временные данные? - PullRequest
2 голосов
/ 21 сентября 2011

Кажется, я нигде не могу найти ответ в Google. Я в основном хочу знать, могут ли два потока одновременно получать доступ к нормальным функциям / функциям-членам и не приводить к неопределенному поведению, или мне нужно использовать мьютекс?

void foo(void)
{
  float x(133.7);
  float y(10);
  std::cout << std::endl << (x * y);
}

void foobar(void)
{
  std::cout << std::endl << 1/1;
}

Ответы [ 2 ]

4 голосов
/ 21 сентября 2011

Я почти уверен, что ваш код не имеет неопределенного поведения.

Тем не менее, вы используете общие данные, а именно std::cout.

Таким образом, если вы ожидаете, что std::cout << std::endl << (x * y) будет выполнен как одна операция (например, чтобы предотвратить чередование битов вывода из разных потоков на стандартный вывод), вам придется использовать блокировки.

0 голосов
/ 21 сентября 2011

Я в основном хочу знать, могут ли два потока одновременно получать доступ к нормальным функциям / функциям-членам и не приводить к неопределенному поведению, или мне нужно использовать мьютекс?Да.Синхронизация требуется только в том случае, если потоки будут использовать общие данные.Синхронизация - это больше защита состояния, а не самого кода.

...