多线程 - 作为参数传递的const char数组

时间:2013-07-03 10:08:06

标签: c++ multithreading boost

我的功能如下:

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 *)时,我得到了错误的内容:     路径??

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

2 个答案:

答案 0 :(得分:3)

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

要更正,请确保提供给laodFunc()的指针在线程的生命周期内保持有效。或者,将const char* pFilePath更改为std::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()副本将在内部存储并传递给线程函数(请参阅Thread Constructor with arguments)。即使参数类型classesloadFunc()const&参数也将被复制,这是值得的。如果需要,可以使用boost::cref()

来避免此副本
boost::thread *new_thread = new boost::thread(&loadFunc,
                                              boost::cref(classes),
                                              myStr.str());

答案 1 :(得分:0)

由于myStr是多个线程使用的全局变量(因此您获得“变量的最新设置”的值,或者使用后“消失”的局部变量,您需要执行此操作让它坚持下去并且每个线程都是唯一的东西。这里目前还不完全清楚你的目的是什么,但是一个“每线程”对象保存字符串,与线程一起创建,并在线程被销毁时被破坏会起作用。