boost::mpi и boost::serialization ошибки

Я использую OpenMPI и Linux Mint, рассмотрим следующий пример:

#include <boost/mpi.hpp>
#include <iostream>
#include <string>
#include <boost/serialization/string.hpp>

namespace mpi = boost::mpi;
using namespace std;

int main()
{
    mpi::environment env;
    mpi::communicator world;

    if (world.rank() == 0)
    {
        world.send(1, 0, std::string("3664010"));
        while (1)
        {
             world.send(1, 0, std::string("3664012"));
             sleep(1);
        }
     }
     else
     {
        std::string msg;
        string dst;
        bool first = true;

        while (1)
        {
            world.recv(0, 0, msg);
            if (first) {dst = msg;first = false;}
            std::cout << "slave received=" << dst << " msg=" << msg << std::endl;
        }
     }

    return 0;
}

Компиляция: mpiC++ -std= C++0x test.cc -lboost_serialization -lboost_mpi
Запустите: mpirun -np 2 ./a.out
Выход: получено ведомым = 3664010 мсг = 3664010
получено ведомого = 3664012 msg = 3664012
получено ведомого = 3664012 msg = 3664012

Ошибка воспроизводится только тогда, когда все сообщения имеют одинаковую длину. Если второе сообщение, например, будет "3664012 и более", все будет работать нормально:
получено ведомого = 3664010 сообщений = 3664010
получено ведомым = 3664010 сообщений = 3664012 и более
получено ведомым = 3664010 сообщений = 3664012 и более
получено ведомым = 3664010 сообщений = 3664012 и более

Похоже, что dst и msg используют один и тот же буфер памяти. И они начинают использовать другой буфер памяти, только если длина строк различна. Я использую следующий обходной путь (msg = string()), чтобы сообщить компилятору об изменении msg:

std::cout << "slave received=" << dst << " msg=" << msg << std::endl;
msg = string();

И это прекрасно работает. Есть ли лучшие решения? Спасибо.

1 ответ

Решение

Проблема была решена с помощью GCC C++11 без строки коровы

Другие вопросы по тегам