Search code examples
c++c++11stdmutexrecursive-mutex

Why C++ concurrency in action listing_6.1 does not use std::recursive_mutex


I am reading the book "C++ Concurrency In Action" and have some question about the mutex used in listing 6.1, the code snippet is below:

void pop(T& value)
{
    std::lock_guard<std::mutex> lock(m);
    if(data.empty()) throw empty_stack();
    value=std::move(data.top());
    data.pop();
}
bool empty() const
{
    std::lock_guard<std::mutex> lock(m);
    return data.empty();
}

The pop method locks the mutex and then calls the empty mutex. But the mutex is not a recursive_mutex, and the code works properly. So I doubt what is the actually difference between std::mutex and std::recursive_mutex.


Solution

  • It is calling data.empty() which seems like a function from a data member. Not the same as the empty function you show.

    If it were, this would be a recursive call

    bool empty() const
    {
        std::lock_guard<std::mutex> lock(m);
        return data.empty();
    }
    

    and nothing would work.