2017-09-26 74 views
4

我有一个案例,我的算法的决定是基于共享的深度std::recursive_mutex访问std所使用的所有者计数器:: recursive_mutex

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

int g_i = 0; 
std::recursive_mutex g_i_mutex; 

void bar() { 
    std::lock_guard<std::recursive_mutex> lock(g_i_mutex); 
    switch (get_counter(g_i_mutex)) { // some way to find the number of owners 
    case 1: std::cout << "depth 1\n"; break; 
    case 2: std::cout << "depth 2\n"; break; 
    default:; 
    } 
} 

void foo() { 
    std::lock_guard<std::recursive_mutex> lock(g_i_mutex); 
    std::cout << "hello\n"; 
    bar(); 
} 

int main() { 
    foo(); //print hello then depth 2 
    bar(); //print depth 1 
} 

我读过递归互斥持有某种类型的使用次数,并增加它们与每个呼叫减少它来锁定/解锁,有没有访问该信息的方法吗?

+1

有可能会是一个相对的地方,但不是[接口]的一部分(http://en.cppreference.com/w/cpp/thread/recursive_mutex)。 –

+0

不是以便携的方式,您仍然可以访问'std :: recursive_mutex :: native_handle()',它可能会为您的实现提供更丰富的接口。 – Jarod42

回答

4

you cannot

这是不可能的,因为你提到的计数器是一个实现解决方案,它可能存在也可能不存在。如果你知道标准库的一个特定实现使用了一个计数器,你可以使用一些魔术(指针算术和转换)来获得它,但这将是未定义的行为。

话虽这么说,没有禁止你定义自己的recursive_mutex

#include <iostream> 
#include <mutex> 
#include <atomic> 

class recursive_mutex 
{ 
    std::recursive_mutex _mutex; 
    std::atomic<unsigned> _counter; 
public: 
    recursive_mutex() : _mutex(), _counter(0) {} 
    recursive_mutex(recursive_mutex&) = delete; 
    void operator=(recursive_mutex&) = delete; 
    void lock() { _mutex.lock(); ++_counter; } 
    bool try_lock() { bool result = _mutex.try_lock(); _counter += result; return result; } 
    void unlock() { --_counter; _mutex.unlock(); } 
    unsigned counter() { return _counter; } 
}; 

int main() { 
    recursive_mutex m; 
    m.lock(); 
    m.lock(); 
    std::cout << m.counter() << "\n"; 
    m.unlock(); 
    std::cout << m.counter() << "\n"; 
    m.unlock(); 
} 

demo

+0

为什么不能用递归互斥来完成它,以及如何实现它的实现示例。非常感谢! – DsCpp

+0

与guard_lock一起使用可能会导致不需要的计数器增加,因为lock_guard调用lock而不是try_lock,对吧? – DsCpp

+0

在多线程场景中,当另一个线程尝试通过创建lock_guard对象来锁定互斥锁时,计数器不会增加,但互斥锁不会被锁定? (lock_guard尝试通过锁来锁定互斥锁,而不是try_lock) – DsCpp

相关问题