gpt4 book ai didi

c++ - 使用 Boost 的进程间读/写锁

转载 作者:可可西里 更新时间:2023-11-01 18:27:30 28 4
gpt4 key购买 nike

This thread在解释如何使用 Boost 实现读/写锁时是黄金。它看起来相对简单,我真的很喜欢它,但它似乎也使用了一个非命名锁,我需要一个进程间解决方案(不需要可移植,可以是仅限 Windows)。

有没有办法让进程间shared_mutex?我看到有一个 named_mutex但我无法让它与 shared_lock 一起使用其他锁。

感谢任何指点。

[编辑]

与此同时,我遇到了this thread这几乎击中了头部的钉子。我有两个问题:

  1. 它没有显示完整的代码(我猜我需要使用 named_upgradable_mutex 但我不太确定)和
  2. 我不喜欢修改后的“编写器”的答案,它不使用在析构函数中解锁的现成类,而是对互斥锁进行 3 次原始调用。

仍然欢迎提出意见或好的解决方案。

最佳答案

Boost.Interprocess 文档描述了所谓的 upgradable mutexes它支持和 upgradable mutex operations对于两种支持的可升级互斥体类型:

编辑:我相信这行得通:

#include <iostream>
#include <string>
#include <unistd.h>

#include <boost/scope_exit.hpp>
#include <boost/interprocess/mapped_region.hpp>
#include <boost/interprocess/shared_memory_object.hpp>
#include <boost/interprocess/sync/interprocess_upgradable_mutex.hpp>
#include <boost/interprocess/sync/scoped_lock.hpp>
#include <boost/interprocess/sync/sharable_lock.hpp>
#include <boost/interprocess/sync/upgradable_lock.hpp>

// http://stackoverflow.com/questions/12439099/interprocess-reader-writer-lock-with-boost/

#define SHARED_MEMORY_NAME "SO12439099-MySharedMemory"

struct shared_data {
private:
typedef boost::interprocess::interprocess_upgradable_mutex upgradable_mutex_type;

mutable upgradable_mutex_type mutex;
volatile int counter;

public:
shared_data()
: counter(0)
{
}

int count() const {
boost::interprocess::sharable_lock<upgradable_mutex_type> lock(mutex);
return counter;
}

void set_counter(int counter) {
boost::interprocess::scoped_lock<upgradable_mutex_type> lock(mutex);
this->counter = counter;
}
};

int main(int argc, char *argv[])
{
using namespace boost::interprocess;

if (argc != 2) {
std::cerr << "Usage: " << argv[0] << " WHICH" << std::endl;
return 1;
}

const std::string which = argv[1];
if (which == "parent") {
shared_memory_object::remove(SHARED_MEMORY_NAME);
shared_memory_object shm(create_only, SHARED_MEMORY_NAME, read_write);

BOOST_SCOPE_EXIT(argc) {
shared_memory_object::remove(SHARED_MEMORY_NAME);
} BOOST_SCOPE_EXIT_END;

shm.truncate(sizeof (shared_data));

// Map the whole shared memory into this process.
mapped_region region(shm, read_write);

// Construct the shared_data.
new (region.get_address()) shared_data;

// Go to sleep for a minute.
sleep(60);

return 0;
} else if (which == "reader_child") {
shared_memory_object shm(open_only, SHARED_MEMORY_NAME, read_write);

mapped_region region(shm, read_write);
shared_data& d = *static_cast<shared_data *>(region.get_address());

for (int i = 0; i < 100000; ++i) {
std::cout << "reader_child: " << d.count() << std::endl;
}
} else if (which == "writer_child") {
shared_memory_object shm(open_only, SHARED_MEMORY_NAME, read_write);

mapped_region region(shm, read_write);
shared_data& d = *static_cast<shared_data *>(region.get_address());

for (int i = 0; i < 100000; ++i) {
d.set_counter(i);
std::cout << "writer_child: " << i << std::endl;
}
}
}

我在 Mac 上用以下脚本试过这个:

#!/usr/bin/env sh
./a.out reader_child &
./a.out reader_child &
./a.out writer_child &
./a.out reader_child &
./a.out reader_child &

(你必须先启动父级:./a.out parent)

输出显示“reader_child”和“writer_child”行的交错(所有“reader_child”行在第一个“writer_child”行之后显示非零值),因此它似乎有效。

关于c++ - 使用 Boost 的进程间读/写锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12439099/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com