recursive_mutextimed_mutex和recursive_timed_mutex
Posted zhiminzeng
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了recursive_mutextimed_mutex和recursive_timed_mutex相关的知识,希望对你有一定的参考价值。
一、recursive_mutex
class MyClass { public: void Fun1() { // std::lock_guard<mutex> sguard(m_mutex); // 加锁处理共享内存 std::lock_guard<recursive_mutex> sguard(m_recurMutex); // 用递归锁能够多次加锁,效率更低 // 用到recursive_mutex 需要考虑代码是否有优化空间,所以尽可能不要在代码中出现 recursive_mutex // ... Fun2(); // 调用Fun2(),中间也加锁了,所以程序会崩溃,mutex 不能多次lock } void Fun2() { // std::lock_guard<mutex> sguard(m_mutex); // 加锁处理共享内存 std::lock_guard<recursive_mutex> sguard(m_recurMutex); // // ... } private: mutex m_mutex; recursive_mutex m_recurMutex; // 递归的独占互斥量 // 允许同一个线程中,同一个互斥量被多次lock };
二、timed_mutex和recursive_timed_mutex
class MyClass { public: void Fun2() { std::chrono::milliseconds time(100); //if (m_timeMutex.try_lock_for(time)) //try_lock_for() 表示等待100毫秒 if (m_timeMutex.try_lock_until(chrono::steady_clock::now() + time)) // 等待直到现在的时间点 + time 的时刻 { // 如果拿到锁,则执行操作共享内存的操作 m_timeMutex.unlock(); // 用完之后需要解锁 } else { // 没拿到锁时,所执行的操作 // 例如:没拿到锁的时候休息1秒 std::this_thread::sleep_for(std::chrono::seconds(1)); } } private: timed_mutex m_timeMutex; // 带超时功能的独占互斥量 // 拿不到锁的时候会等待一段时间,如果还拿不到,会往下执行 // try_lock_for() : 等待一段时间,如果拿到锁,或者等待超过时间没有拿到锁,就直接往下走 // try_lock_until() : 参数是一个未来的时间点,在这个未来的时间没到的时间内 // 如果拿到了所,就走下来,如果时间到了,没拿到锁,程序流程也走下来 recursive_timed_mutex m_timeRecurMutex; // 可以多次lock的 timed_mutex };
以上是关于recursive_mutextimed_mutex和recursive_timed_mutex的主要内容,如果未能解决你的问题,请参考以下文章