c++同步定时等待
C++ Synchronization timed wait
我有一个多线程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();
}
如果您想要允许IsFree()
的外部,代码是好的。否则,正如Yakk在注释中指出的那样,将m_BusyFlag
声明为简单布尔值就足够了。atomic_flag
是开销,因为变量总是在互斥对象下被访问。
您拥有使用条件等待所需的最小工具:条件变量,互斥锁和用于等待其状态的正常变量。因此,更简单的实现(简单锁定)只有在线程需要调用UnlockSeqNum
时才有可能,该线程之前已经调用了LockSeqNum。
相关文章:
- Ardunio UNO解决了多个重叠的定时器循环
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 如何让LLDB在成功时退出,在失败时等待
- 等待整个 omp 块完成,然后再调用第二个函数
- 提升 ASIO - io_service 不要等待连接到线程
- 如何在C++中实现带有packaged_task的异步等待循环?
- 虚假唤醒是否会解锁所有等待线程,甚至是不相关的线程?
- 如何等待窗口隐藏在Qt中?
- 如何在不等待检索的情况下获取C++中的内存位置?
- 等待被迷住了,没有回来
- 等待 WaitForMultipleObjects 窗口中的事件数量可变
- 处理影响跨不同线程共享对象的定时回调的最佳方法是什么?
- 我们能否在stm32f中使用硬件定时器控制两个独立的进程
- Arduino Nano:A4988 使用串行输入时通过定时器进行步进控制不稳定
- 一个线程等待多个线程事件
- 等待 qthread 终止的正确方法是什么?
- 不可预测的C++睡眠/等待行为
- Bison/flex 在识别规则后等待输入
- RabbitMQ C库如何对amqp_simple_wait_frame进行定时等待
- c++同步定时等待