c++ - 在已锁定的互斥体上使用 boost::interprocess 条件变量
问题描述
我想在已经锁定的互斥锁上使用 boost::interprocess 条件变量。我已经锁定了已经使用mutex->lock();
函数的互斥锁,因此scoped_lock并不适合我。boost::interprocess 中是否有任何 API 可以在不使用的情况下等待条件变量scoped_lock
?我正在寻找一个类似于下面的 API:
condition_variable.wait(mutex)
在上面的代码块中,互斥锁已经被锁定,所以不需要scoped_lock
. 但是,上面的代码块不起作用,因为 boost 需要 alock
而不是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
要求。
这是一个小演示,假设您的进程间互斥锁和条件有一些类型:
#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
推荐阅读
- python-3.x - 具有两个变量的函数:一个将用作函数中的字符串 - Python 3 - pandas
- android - 在 BottomSheetDialogFragment 中以编程方式设置窥视高度
- python - 网络浏览器打开的标签不超过 1 个
- google-cloud-platform - Google 存储权限访问被拒绝
- python - 在 Atom 中运行 Python 并接受用户输入
- laravel - SQLSTATE[42S22]:在 Laravel 中找不到列
- r - 使用 mtext 函数时的 'pos' 等效项
- angular - 仅从 Observable 获取最新值
- python - Selenium python 故障查找元素
- r - 错误:`data` 必须是数据框,或其他可被`fortify()`强制的对象,而不是 S3 对象