Ну, если честно, это действительно не имеет значения насколько медленнее. Либо вам нужна синхронизация, либо нет.
Неиспользование, когда это необходимо, может привести к неверным результатам. Вы бы предпочли иметь медленный код или неправильный код?
Сказав это, я вижу, что ваши потоки блокируют мьютекс на все время итерации в десять миллионов l oop. Это практически то же самое, что последовательный вызов двух функций. Если вы хотите истинный параллелизм, операции блокировки и разблокировки будут внутри l oop, что-то вроде (псевдокод):
do 10,000,000 times:
lock mutex
do operation
unlock mutex
Но имейте в виду, что многопоточность полезно только тогда, когда разногласия относительно низкие . Если двум потокам нужна блокировка в 99% случаев (как, кажется, имеет место в вашем коде, даже с перемещением блокировки в пределах l oop), вы не увидите такого большого улучшения , если таковые имеются.
Вы можете даже увидеть деградацию, поскольку потоки по-прежнему в основном взаимоисключающие, но с добавленными мьютексами для замедления всего этого.