Насколько я помню, переменная, которую вы защищали, фактически не распределяется между процессами. Он существует в своем собственном контексте внутри каждого из потоков. Таким образом, вопрос о том, что будет печататься, зависит только от того, когда каждый поток запланирован.
Я не думаю, что один простой мьютекс позволит вам гарантировать правильность, если правильность определяется как печать 0, 1, 2, 3 ...
то, что делает ваш код, создает несколько контекстов выполнения, используя код в вашей функции sum в качестве кода выполнения. переменная, которую вы защищаете, если она не объявлена как статическая, будет уникальной для каждого вызова этой функции.
В конце концов, это совпадение, что вы заставляете одну систему печатать правильно, потому что у вас нет логического метода блокировки потоков, пока не наступит их правильный оборот.