Не получается захватить блокировку из другого потока

#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++


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