boost managed_shared_memory find() 方法永远卡在互斥锁上

boost managed_shared_memory find() method stuck on mutex forever

我有以下程序,这是它应该做的:

我是这样测试的:

感谢任何帮助。

  • waits forever (not sure if this is needed, just added it to make sure linux doesn't free that shared memory as soon as the program exits)

不,这不是必需的。共享内存是 shared。它会保留,除非你明确地 remove() 它。

评论

您至少有一处不一致:对象的名称是 "Datastore""DataStore" - 确保拼写匹配。

除此之外,我认为

  • 您可能不想要 "array-style" 分配,您正在(无意中?)使用
  • 您最好使用 find_or_construct,它确实消除了潜在的 race-condition(time-of-check vs time-of-use window 在查找和创建新实例之间, 分别).

除此之外,我看不出有任何直接的挂起原因。也许您可以尝试手动删除一次共享对象,然后使用以下简化程序 re-test:

#include <boost/interprocess/managed_shared_memory.hpp>
#include <iostream>
#include <cassert>
namespace bip = boost::interprocess;

class data_store {
  public:
    data_store(uint32_t id, const char *name, bool safe) :
        id_(id), safe_(safe)
    {
        id_ = id;
        assert(name && strlen(name) < (sizeof(name_)-1));
        strncpy(name_, name, sizeof(name_));
        safe_ = safe;
    }

    uint32_t   id()    const { return id_; }
    const char *name() const { return name_; }

  private:
    char name_[32] = {0};
    uint32_t id_;
    bool safe_;
};

int main () try {
    bip::managed_shared_memory seg(bip::open_or_create, "seg2", 2048);
    data_store ds = *seg.find_or_construct<data_store>("DataStore")(1, "ds", true);
    std::cout << "Free size " << seg.get_free_memory() << std::endl;    
    std::cout << "Data store name " << ds.name() << std::endl;
} catch (std::exception ex) {
    std::cerr << ex.what() << '\n';
}

它包含一些样式修复以及对名称长度的额外断言。

Live On Coliru

注意:在 Coliru 上使用 managed_mapped_file,因为 manged_shared_memory 在 Coliru 上不可用。

打印:

Free size 1712
Data store name ds
-rw-r--r-- 1 2001 2000 2.0K Mar  5 12:26 seg2
Free size 1712
Data store name ds