В 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();
}
но так как никто не гарантирует, что первый поток успеет захватить мютекс раньше, то у Вас возможно два разных варианта исполнения.