C ++同步定时等待

时间:2015-07-06 17:51:11

标签: c++ multithreading c++11 concurrency synchronization

我有一个多线程的c ++应用程序。我想标记一个忙/自由状态的对象,例如:

  • 线程可以切换对象的状态
  • 线程必须随时拥有对某些公共成员函数的独占访问权限(而其他公共成员函数不需要同步)
  • 如果对象繁忙,则线程可以选择无限期等待或定义一段时间,直到对象空闲为止。

我实施了以下要求,有更好的方法吗?

#include <condition_variable>
#include <mutex>  
#include <atomic>
#include <thread>
#include <iostream>

std::mutex m_Mutex;
std::condition_variable m_ConditionVariable;
std::atomic_flag m_BusyFlag;

const int TRY_LOCK_TIMEOUT_MILLIS = 1;

bool IsFree() { return !m_BusyFlag.test_and_set(); }

bool LockSeqNum(bool timed_wait)
{
    std::cout <<" TRY LockSeqNum, thread= " << std::this_thread::get_id() << endl;
    bool success = true;
    std::unique_lock<std::mutex> lck(m_Mutex);
    if (m_BusyFlag.test_and_set())
    {
        if (timed_wait)
            success = !m_ConditionVariable.wait_for(lck, std::chrono::milliseconds(TRY_LOCK_TIMEOUT_MILLIS), [] { return IsFree(); });
        else
            m_ConditionVariable.wait(lck, [] { return IsFree(); });
    }

    std::cout << "LockSeqNum " << success << "  thread = " << std::this_thread::get_id() << endl;
    return success;
}

void UnlockSeqNum()
{
    std::cout << " UNLockSeqNum, thread= " << std::this_thread::get_id() << endl;
    std::unique_lock<std::mutex> lck(m_Mutex);
    m_BusyFlag.clear();
    m_ConditionVariable.notify_one();
}

1 个答案:

答案 0 :(得分:0)

如果您想允许IsFree()的外部,代码就可以了。否则,正如Yakk在评论中指出的那样,将m_BusyFlag声明为简单的布尔值就足够了。 atomic_flag是开销,因为变量总是在互斥锁下访问。

使用条件等待所需的最小工具:条件变量,互斥和正常变量等待其状态。因此,只有当线程需要调用UnlockSeqNum时才能实现更简单的实现(简单锁定),之前调用了LockSeqNum。