我有一个多线程的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();
}
答案 0 :(得分:0)
如果您想允许IsFree()
的外部,代码就可以了。否则,正如Yakk在评论中指出的那样,将m_BusyFlag
声明为简单的布尔值就足够了。 atomic_flag
是开销,因为变量总是在互斥锁下访问。
使用条件等待所需的最小工具:条件变量,互斥和正常变量等待其状态。因此,只有当线程需要调用UnlockSeqNum
时才能实现更简单的实现(简单锁定),之前调用了LockSeqNum。