在已经锁定的互斥锁上使用 boost::interprocess 条件变量

如何解决在已经锁定的互斥锁上使用 boost::interprocess 条件变量

我想在已经锁定的互斥锁上使用 boost::interprocess 条件变量。我已经使用 mutex->lock(); 函数锁定了互斥锁,因此 scoped_lock 并不适合我。 boost::interprocess 中是否有任何 API 可以在不使用 scoped_lock 的情况下等待条件变量?我正在寻找类似于以下内容的 API:

condition_variable.wait(mutex)

在上面的代码块中,互斥锁已经被锁定,所以不需要scoped_lock。然而,上面的代码块不起作用,因为 boost 需要一个 lock 而不是 mutex 作为 `wait 的第一个参数。我可以使用下面的函数调用在 pthread 中做同样的事情:

pthread_cond_wait(condition_variable,mutex)

解决方法

您需要一个 BasicLockable。事实上,scoped_lock(或lock_guard)不是那样的。 unique_lock 和类似的有:

unique_lock 满足 BasicLockable 要求。如果Mutex 满足 Lockable 要求,unique_lock 也满足 Lockable 要求(例如:可以在std::lock中使用);如果 Mutex 满足 TimedLockable 要求,unique_lock 也满足 TimedLockable 要求。

这是一个小演示,假设您的进程间互斥锁和条件有一些类型:

Coliru

#include <boost/date_time/posix_time/posix_time.hpp>
#include <boost/interprocess/managed_mapped_file.hpp>
#include <boost/interprocess/sync/interprocess_condition.hpp>
#include <boost/interprocess/sync/interprocess_mutex.hpp>
#include <mutex>
#include <thread>
namespace bip = boost::interprocess;
using namespace std::literals;

using boost::posix_time::milliseconds;
auto now = boost::posix_time::microsec_clock::universal_time;

int main() {
    bip::managed_mapped_file mmf(bip::open_or_create,"mapped.dat",32<<10);

    auto& mutex = *mmf.find_or_construct<bip::interprocess_mutex>("mutex")();
    auto& cond  = *mmf.find_or_construct<bip::interprocess_condition>("cond")();
    auto& data  = *mmf.find_or_construct<int>("data")(0);

    auto is_ready = [&data] { return data != 42; };

    std::unique_lock lk(mutex);

    /*void*/ cond.wait(lk);

    /*void*/ cond.wait(lk,is_ready);

    // check return values for these:
    cond.timed_wait(lk,now() + milliseconds(120));
    cond.timed_wait(lk,now() + milliseconds(120),is_ready);
}

(当然这会永远阻塞,因为没有任何东西通知条件)。

添加了一个运行演示,其中包含一个非常快速和肮脏的信号线程:http://coliru.stacked-crooked.com/a/a1eb29653f1bbcee

没有标准库

您可以使用等效的 Boost 类型:https://www.boost.org/doc/libs/1_76_0/doc/html/thread/synchronization.html#thread.synchronization.locks

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?