我正在尝试在共享内存块上分配一个原子(在linux上)。 原子将同时访问和修改我的多个线程。 在共享内存上分配它的理由是因为我想保留值,所以如果我的进程重新启动,则可以恢复先前的状态。 我知道如果我在共享内存中使用互斥锁,我必须将其初始化为共享。对原子有什么这样的要求吗? 这可行吗?
答案 0 :(得分:2)
是的,你可以这样做。这是我从Quora(ripped code from Quora)中删除的一个例子,而不是我的代码,包括boost,所以我没有测试过它:
#include <atomic>
#include <string>
#include <iostream>
#include <cstdlib>
#include <boost/interprocess/managed_shared_memory.hpp>
using namespace std::string_literals;
namespace bip = boost::interprocess;
static_assert(ATOMIC_INT_LOCK_FREE == 2,
"atomic_int must be lock-free");
int main(int argc, char *argv[])
{
if(argc == 1) //Parent process
{
struct shm_remove {
shm_remove() { bip::shared_memory_object::remove("szMem");}
~shm_remove(){ bip::shared_memory_object::remove("szMem");}
} remover;
bip::managed_shared_memory segment(bip::create_only,
"szMem", 65536);
auto ap = segment.construct<std::atomic_int>("the counter")(0);
//Launch 5 child processes
std::string s = argv[0] +" child"s;
std::system((s + '&' + s + '&' + s + '&' + s + '&' + s).c_str());
std::cout << "parent existing: counter = " << *ap << '\n';
segment.destroy<std::atomic_int>("the counter");
} else { // child
bip::managed_shared_memory segment(bip::open_only, "szMem");
auto res = segment.find<std::atomic_int>("the counter");
for(int n = 0; n < 100000; ++n)
++*res.first; // C++17 will remove the dumb "first"
std::cout << "child exiting, counter = " << *res.first << '\n';
}
}
这是文档: link to Boost docs