【发布时间】:2016-05-26 17:01:45
【问题描述】:
我在为两个程序之间的共享内存操作实现 boost/interprocess 库时遇到了一些麻烦。这是我第一次使用任何共享内存操作,我首先修改了我在这里找到的 boost 文档中的一些示例代码:(http://www.boost.org/doc/libs/1_41_0/doc/html/interprocess/quick_guide.html)。
修改后的demo效果不错,基本是这样的:
typedef std::pair<double, int> MyType;
managed_shared_memory segment(create_only, "MySharedMemory", 65536);
MyType *instance = segment.construct<MyType>
("MyType instance") //name of the object
(12.34, 0); //ctor first argument
MyType *instance2 = segment.construct<MyType>
("MyType instance2") //name of the object
(56.78, 0); //ctor first argument
然后在另一个进程中,检索这些变量:
managed_shared_memory segment(open_only, "MySharedMemory");
std::pair<MyType*, managed_shared_memory::size_type> res;
std::pair<MyType*, managed_shared_memory::size_type> res2;
res = segment.find<MyType>("MyType instance");
printf("1: %d, %d\n", res.first, res.second); // show pointer and size
printf("1a: %f\n\n", *res.first); //show double value
res2 = segment.find<MyType>("MyType instance2");
printf("2: %d, %d\n", res2.first, res2.second); // show pointer and size
printf("2a: %f\n", *res2.first); // show double value
好的,看起来一切正常,终端输出是:
1: 196724, 1
1a: 12.340000
2: 196780, 1
2a: 56.780000
问题是当我尝试在另一个(现有)应用程序中复制它时。
据我所知,我所做的一切几乎都是一样的(在语法方面甚至可能是一样的?),但得到了一些不同的和意想不到的结果。
typedef std::pair<double, int> myDouble;
managed_shared_memory segment(create_only, "sharedMemBlock", 65536);
myDouble *valX = segment.construct<myDouble>
("valX")
(1.1, 0);
myDouble *valY = segment.construct<myDouble>
("valY")
(2.2, 0);
myDouble *valZ = segment.construct<myDouble>
("valZ")
(3.3, 0);
并在第二个过程中检索这些值:
managed_shared_memory segment(open_only, "sharedMemBlock");
std::pair<myDouble*, managed_shared_memory::size_type> valShrX;
std::pair<myDouble*, managed_shared_memory::size_type> valShrY;
std::pair<myDouble*, managed_shared_memory::size_type> valShrZ;
valShrX = segment.find<myDouble>("valX");
valShrY = segment.find<myDouble>("valY");
valShrZ = segment.find<myDouble>("valZ");
printf("PtrvalSharedX: %d,PtrvalSharedY: %d, PtrvalSharedZ: %d\n", valShrX.first, valShrY.first, valShrZ.first);
printf("valSharedX: %f, valSharedY: %f, valSharedZ: %f\n\n", *valShrX.first, *valShrY.first, *valShrZ.first);
但结果不是我所期望的,结果是这样的:
PtrvalSharedX: 196724, PtrvalSharedY: 196772, PtrvalSharedZ: 196820
valSharedX: 1.100000, valSharedY: 0.000000, valSharedZ: 2.200000
那么,这里发生了什么?为什么我没有分别获得 valSharedX、valSharedY 和 valSharedZ 的 1.1、2.2 和 3.3?
不知道为什么本质上相同的代码在一个实例中有效,而在另一个实例中无效。我注意到第一个示例中的指针之间的差异 (196780 - 196724) = 56,但在第二个示例中较小 (196772 - 196724) = (196820 - 196772) = 48。不确定这是否相关,但认为它值得指出(双关语!)。
谢谢, 乙
【问题讨论】:
-
什么是
myDouble? -
抱歉,在整理摘录时忘记了这一行。定义与第一个示例中的 MyType 完全相同。 typedef std::pair
myDouble; -
你应该edit你的问题现在包括它。但是,当我查看您的代码时,问题并不是很明显,而且我没有自己尝试的提升。
-
好的..已编辑..还有谁对这个问题投了反对票,为什么?希望这不是因为我遗漏了 myDouble 的 typedef ......我没有理由明白为什么这个问题应该被否决。不管你是谁,大声说出来!
-
不幸的是,没有办法知道谁投了反对票,您的评论可能会被置若罔闻,因为他们可能永远不会看到它。如果这是一种微妙的提问方式,我没有否决这个问题。
标签: c++ boost shared-memory interprocess boost-interprocess