Получение общих векторов из разделяемой памяти Boost InterProcess

Я создал разделяемую память Boost для обмена векторами.

Раздача состоялась.

Однако я не понимаю, как векторы помещаются в общую память.

Я делаю push_back в общей памяти из процесса записи. Итак, векторы помещаются как стек push в разделяемую память в порядке LIFO?

Другое приложение, читатель, извлекает вектор следующим образом:

managed_shared_nmemory segment (open_only, "Shared_mem_name");
Vector = segment.find<VECTOR_TYPE>("Vector_name").first;

if (Vector != NULL)
{
    //CODDE
}

Теперь вот, какой вектор я читаю. тот, который вставлен последним (самый новый)? И если я это читаю, означает ли это, что вектор выскочил? то есть он все еще находится в общей памяти после чтения, и если да, то будет ли через какое-то время переполняться общая память, и как мне это остановить? Я не вижу ничего в документации по этому поводу...


person user1173240    schedule 06.02.2014    source источник
comment
Убедитесь, что у вас правильная синхронизация процессов и используется ли распределитель IPC в VECTOR_TYPE. Я предлагаю вам начать с примера из документации.   -  person sehe    schedule 06.02.2014


Ответы (1)


Векторы не "вталкиваются" в общую память. Неявного стека нет.

Вместо этого вектор живет в общей памяти. То, что вы читаете, на самом деле является тем же вектором, что и в другом процессе, в то же самое время.

Обратите внимание, что это строго подразумевает, что вам также нужен общий мьютекс для синхронизации доступа, иначе у вас будут гонки данных между потоками (из разных процессов), и по определению это Неопределенное поведение в C++.


Немного под другим углом:

Я делаю push_back в общей памяти из процесса записи. Таким образом, векторы помещаются в разделяемую память, как стек, в порядке LIFO?

Разбивая это:

  • #P7#
    #P8#
  • #P9#
    #P10#
  • как стек, помещенный в разделяемую память, в порядке LIFO?

    Нет, есть только 1 вектор. Вектор сам по себе является упорядоченным последовательным контейнером. Он поддерживает произвольный доступ, поэтому

    for (auto it = v.begin(); it!= v.end(); ++it)
    {  // process `*it` in order
    } 
    

    vs

    for (auto it = v.rbegin(); it!= v.rend(); ++it)
    {  // process `*it` in reversed order
    } 
    

    Если вы всегда используете push_back для вставки, то итерация in order похожа на "FIFO"

person sehe    schedule 06.02.2014
comment
Значит, в этом случае, если я читаю запись Vector = segment.find<VECTOR_TYPE>("Vector_name").first; , я на самом деле читаю самую первую запись, которая была на ней записана? И каково поведение, когда разделяемая память заполняется? Он начинает перезаписывать с первого раза? - person user1173240; 07.02.2014
comment
Нет. Как всегда, вы получите исключение std::bad_alloc, если аллокатору не хватит памяти? - person sehe; 07.02.2014
comment
@ user1173240 PS. Если вы хотите такое поведение, посмотрите на boost::circular_buffer, например. boost.org/doc/libs/1_55_0/doc/html/ круговой_буфер.html - person sehe; 07.02.2014
comment
Большое спасибо. Я взгляну. - person user1173240; 10.02.2014