2015-11-25 46 views
2

我用了openmpi和Linux Mint的, 考慮下面的例子:的boost :: MPI和boost ::系列化錯誤

#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味精= 3664012
從站接收= 3664012味精= 3664012

僅當所有消息具有相同長度時纔會重現該錯誤。例如,如果第二消息將是 「3664012andmore」 一切很好地工作:
從站接收= 3664010味精= 3664010
從站接收= 3664010味精= 3664012andmore
從站接收= 3664010味精= 3664012andmore
從站接收= 3664010味精= 3664012andmore

它看起來像dst和msg使用相同的內存緩衝區。只有當字符串長度不同時,他們纔開始使用不同的內存緩衝區。我用以下解決方法(味精=字符串())來告訴編譯器,味精改變:

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

,它工作正常。有沒有更好的解決方案?謝謝。

+0

我用-O0編譯。用更少的字符一切都很好。只有等長的問題 – Alex

+1

你可以用調試器檢查'dst'和'msg'是否真的爲字符數組使用相同的內存? '序列化'中可能沒有寫入時拷貝? – BeyelerStudios

+0

我輸出了地址(int *)dst.c_str()和(int *)msg.c_str()。他們等於 – Alex

回答

0

問題已經通過使用gcc C++ 11解決了,但沒有字符串牛