Я хотел бы понять поведение следующего кода.boost: interprocess> managed_shared_memory> различные значения
IDAInterface - это библиотека с членом «myValue».
С ++:
#include <boost/interprocess/managed_shared_memory.hpp>
#include <cstdlib>
#include <idainterface.h>
IDAInterface ifIDA;
int main(int argc, char *argv[])
{
using namespace boost::interprocess;
typedef std::pair<IDAInterface, int> MyType; // [1]
if(argc == 1){ //Parent process
struct shm_remove{
shm_remove() { shared_memory_object::remove("MySharedMemory"); }
~shm_remove(){ shared_memory_object::remove("MySharedMemory"); }
} remover;
ifIDA.myValue = 15;
managed_shared_memory segment(create_only, "MySharedMemory", 65536);
MyType *instance = segment.construct<MyType> ("MyType instance") (ifIDA, 0);
std::string s(argv[0]); s += " child ";
if(0 != std::system(s.c_str())) return 1;
std::cout<<"\nPROZESS 1 "<< ifIDA.myValue;
std::cout.flush();
//std::cout<<"\nPROZESS 1 "<< instance->first.myValue;
//std::cout.flush();
//segment.destroy<MyType>("MyType instance");
if(segment.find<MyType>("MyType instance").first) return 1;
}
else{
managed_shared_memory segment(open_only, "MySharedMemory");
std::pair<MyType*, managed_shared_memory::size_type> res;
res = segment.find<MyType> ("MyType instance");
if(res.second != 1) return 1;
IDAInterface nIFIDA;
nIFIDA = res.first->first;
std::cout<<"\nPROZESS 2 "<< nIFIDA.myValue;
std::cout.flush();
nIFIDA.EineZahl = 10;
std::cout<<"\nPROZESS 2 "<< nIFIDA.myValue;
std::cout.flush();
segment.destroy<MyType>("MyType instance");
}
return 0;
}
Выход:
Prozess 2 15
Prozess 2 10
Prozess 1 15
Prozess 1 15
Как я понял, должно быть значение в процессе 1, после запуска процесса 2, также 10. Почему в процессе 1 значение «myValue» всегда равно 15? И как получить измененное значение «myValue» через процесс 2 в процессе 1?
Добро пожаловать в StackOverflow. Когда это возможно, предоставьте в своих вопросах примеры [sscce] (http://sscce.org/). В этом случае предоставленный код и указанный вывод не совпадают. –