Не получается захватить блокировку из другого потока
#include <iostream>
#include <mutex>
#include <thread>
class A
{
private:
std::mutex m{};
public:
void foo()
{
for(uint64_t i = 0; i < 10; i++)
{
std::lock_guard lock(m);
std::this_thread::sleep_for(std::chrono::seconds(1));
}
}
void pause()
{
m.lock();
}
void resume()
{
m.unlock();
}
};
int32_t main()
{
A a;
std::thread th(&A::foo, &a);
char ch;
std::cin >> ch;
a.pause();
std::clog << "paused\n";
std::cin >> ch;
a.resume();
th.join();
}
Сначала в main() создаётся другой поток, который исполняет A::foo(), внутри A::Foo() поток крутится в цикле for.
В цикле for держится блокировка на мьютекс, однако, после каждой итерации цикла вызывается деструктор от std::lock_guard, который освобождает блокировку. На итерациях цикла поток просто спит(std::this_thread::sleep_for()).
Из основного потока пытаюсь захватить блокировку на мьютекс, вызывая метод A::pause(). Но у A::pause() не получается захватить блокировку вплоть до выхода параллельного потока из цикла for. Почему блокировка не захватывается?
Собирал программу на linux, последний gcc(12.2.0), компилировал так: g++ -std=c++20 -O3 -s -flto mutex.cpp -Wall -Wextra -Weffc++