DsC*_*Cpp 5 c++ multithreading stl 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
}
Run Code Online (Sandbox Code Playgroud)
我已经读过递归互斥锁持有某种使用计数,并且每次调用锁定/解锁时它们会增加和减少它,有没有办法访问这些信息?
不,你不能.
这是不可能的,因为你提到的计数器是一个实现解决方案,它可能存在也可能不存在.如果您知道标准库的特定实现使用了计数器,您可以使用一些魔术(指针算法和强制转换)来获取它,但这将是未定义的行为.
话虽这么说,没有什么禁止你定义自己的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();
}
Run Code Online (Sandbox Code Playgroud)
2
1
| 归档时间: |
|
| 查看次数: |
231 次 |
| 最近记录: |