2

我有一个功能如下:

laodFunc(const map<uint16_t, string> & pClasses, const char * pFilePath);

我就是这样称呼它的。为了将其作为带有 boost 的新线程运行

boost::thread_group g;
stringstream myStr;
......
boost::thread *new_thread = new boost::thread(&loadFunc,classes,myStr.str().c_str());
 g.add_thread(new_thread);

但是当我在调用的方法中显示给定的路径(char *)时,我得到一个错误的内容:路径??

我想知道我在这里做错了什么。谢谢

4

2 回答 2

4

所引用的内存被myStr.str().c_str()立即销毁(因为临时std::string返回的myStr.str()被销毁),因此线程正在取消引用一个悬空指针(导致未定义的行为)。

要更正,请确保提供给的指针laodFunc()在线程的生命周期内保持有效。或者,更改const char* pFilePathstd::string const& pFilePath

loadFunc(const map<uint16_t, string> & pClasses, std::string const& pFilePath);

boost::thread *new_thread = new boost::thread(&loadFunc, classes, myStr.str());

并且副本myStr.str()在内部存储并传递给线程函数(请参阅带参数的线程构造函数)。classes即使参数类型loadFunc()是 a ,参数也将被复制是毫无价值的const&。如果需要,可以使用以下方法避免此副本boost::cref()

boost::thread *new_thread = new boost::thread(&loadFunc,
                                              boost::cref(classes),
                                              myStr.str());
于 2013-07-03T10:15:05.767 回答
0

由于myStr要么是多个线程使用的全局变量(所以你得到“变量的最新设置”的值,或者是使用后“消失”的局部变量,你需要做一些事情来使它持久化并且是唯一的每个线程。这里并不完全清楚你的目的是什么,但是一个“每个线程”对象可以保存字符串,与线程一起创建,并在线程被销毁时被销毁。

于 2013-07-03T10:18:22.753 回答