c++ - C++ atomics:如何只允许一个线程访问一个函数?
问题描述
我想编写一个一次只能由一个线程访问的函数。我不需要忙等待,如果另一个线程已经在运行它,那么残酷的“拒绝”就足够了。到目前为止,这是我想出的:
std::atomic<bool> busy (false);
bool func()
{
if (m_busy.exchange(true) == true)
return false;
// ... do stuff ...
m_busy.exchange(false);
return true;
}
- 原子交换的逻辑是否正确?
- 将这两个原子操作标记为是否正确
std::memory_order_acq_rel
?据我了解,宽松的排序 (std::memory_order_relaxed
) 不足以防止重新排序。
解决方案
您的原子交换实现可能会起作用。但是尝试在没有锁的情况下进行线程安全编程总是充满问题并且通常更难维护。
除非需要提高性能,否则只需std::mutex
使用该try_lock()
方法即可,例如:
std::mutex mtx;
bool func()
{
// making use of std::unique_lock so if the code throws an
// exception, the std::mutex will still get unlocked correctly...
std::unique_lock<std::mutex> lck(mtx, std::try_to_lock);
bool gotLock = lck.owns_lock();
if (gotLock)
{
// do stuff
}
return gotLock;
}
推荐阅读
- python - Python 使用包含反斜杠和双引号的参数运行带有子进程的命令
- postgresql - 来自 timestampz 的 Postgres 日期字符串(忽略时区)?
- javascript - 如何突出显示 SVG 折线
- r - 在指定时间之间生成样本日期时间
- python - Convolution2D“输入深度不是滤波器输入深度的倍数”
- sql - 如何将文件从桌面加载到 Hive
- c++ - 包含 CallbackGroups 后 ROS 通信没有响应
- vscode-debugger - VSCode 调试将断点移回上一个
- sql - 缩小 NAVISION 2009 R2 报告上的 SQL 查询范围
- r - 在与 R 约会之后获取下周三的日期