Да, вы абсолютно можете это сделать. Вам необходимо использовать межпроцессные библиотеки boost. Вам нужен (1) мьютекс для арбитража доступа к вектору и (2) вы должны иметь возможность размещать элементы вектора в разделяемой памяти. Вы должны быть в состоянии сделать это в одном сегменте разделяемой памяти. Однако я не мог заставить его работать в короткие сроки. Вот решение, использующее два сегмента общей памяти, один для мьютекса и один для вектора.
#include <iostream>
#include <string>
#include <boost/interprocess/sync/interprocess_mutex.hpp>
#include <boost/interprocess/shared_memory_object.hpp>
#include <boost/interprocess/mapped_region.hpp>
#include <boost/interprocess/sync/scoped_lock.hpp>
#include <boost/interprocess/managed_shared_memory.hpp>
#include <boost/interprocess/allocators/allocator.hpp>
#include <boost/chrono.hpp>
#include <boost/thread/thread.hpp>
using namespace boost::interprocess;
typedef allocator<int, managed_shared_memory::segment_manager>
ShmemAllocator;
typedef std::vector<int, ShmemAllocator> MyVector;
struct B
{
boost::interprocess::interprocess_mutex mutex;
};
int main(int cArgs, char* ppszArgs[])
{
if (cArgs== 1) { //Parent process
std::cout << "In parent" << std::endl;
//Remove shared memory on construction and destruction
struct shm_remove
{
shm_remove() { shared_memory_object::remove("MutexMemory"); }
~shm_remove() { shared_memory_object::remove("MutexMemory"); }
} remover;
shared_memory_object::remove("VectorMemory");
managed_shared_memory segment
(create_only
, "VectorMemory" //segment name
, 65536); //segment size in bytes
const ShmemAllocator alloc_inst(segment.get_segment_manager());
shared_memory_object shm(create_only, "MutexMemory", read_write);
MyVector* myvector =
segment.construct<MyVector>("MyVector") //object name
(alloc_inst);//first ctor parameter
shm.truncate(1000);
mapped_region region(shm, read_write);
void* addr = region.get_address();
B* test = new (addr) B();
// parentProcess(); -> this method just starts the child process
int index = 1;
while (true)
{
if (index < 10000)
{
scoped_lock<interprocess_mutex> lock(test->mutex);
myvector->push_back(index);
}
Sleep(1000);
++index;
}
}
else
{
std::cout << "In child" << std::endl;
//Open already created shared memory object.
shared_memory_object shm(open_only, "MutexMemory", read_write);
//Map the whole shared memory in this process
mapped_region region(shm, read_write);
B* mem = (B*)region.get_address();
managed_shared_memory segment
(open_only
, "VectorMemory"); //segment name
MyVector* myvector = segment.find<MyVector>("MyVector").first;
while (true)
{
if(1)
{
scoped_lock<interprocess_mutex> lock(mem->mutex);
std::cout << (myvector->size() == 0 ? -1 : (*myvector)[myvector->size() - 1]) << std::endl;
}
Sleep(1000);
}
}
}