在共享内存上分配原子

Allocating a atomic on shared memory

本文关键字:分配 共享 内存      更新时间:2023-10-16

我正在尝试在共享内存块上分配原子(在Linux上(。原子将同时访问和修改我的多个线程。在共享内存上分配的背后理性是因为我想坚持这些值,因此,如果我的过程重新启动,则可以恢复先前的状态。我知道一个事实,如果我在共享内存中使用互斥品,则必须将其作为共享初始化。对原子有什么要求吗?这是可行的吗?

是的,您可以做到。这是我从Quora(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';
  }
}

这是文档:链接到Boost Docs