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