В visual studio 19 std::mutex не блокирует поток

В коде ниже не происходит мною ожидаемая блокировка переменной w. Почему это случается? Спасибо.

  #include <iostream>   
#include <thread>         
#include <mutex>       

std::mutex mtx;   

int w = 0;
void f1() {
    mtx.lock();
    std::cout << "f1_lock\n";
    for (int i = 0; i < 1000; i++) {
        w++;
   std::this_thread::sleep_for(std::chrono::milliseconds(1));
    }
    std::cout << "f1_UNlock\n";
     mtx.unlock();
}

void f2() {
  std::cout << --w << "\nf2\n";
}

int main(){
    std::thread t1(f1 );
    std::thread t2(f2 );

    t1.join(); 
    t2.join();

    return 0;
}

Ответы (1 шт):

Автор решения: KoVadim

std::mutex никогда не мог и не может заблокировать переменную. Он блокируют куски кода от одновременного выполнения. Поэтому, если нужно "заблокировать переменную, то нужно во всех местах чтения/записи нужной переменной расставить мютекс.

В случае с вопроса, скорее всего нужно вот так поправить

void f2() {
  mtx.lock();
  std::cout << --w << "\nf2\n";
  mtx.unlock();
}

но так как никто не гарантирует, что первый поток успеет захватить мютекс раньше, то у Вас возможно два разных варианта исполнения.

→ Ссылка