【发布时间】:2012-09-25 07:10:12
【问题描述】:
我在没有 C++11 的多个平台和编译器上使用 boost 1.51。
在我的主线程中,我有一个很长、很昂贵的复制 std::string veryLongString,我需要将其传递给一个新线程进行处理。
创建新线程后,我不再使用主线程上的veryLongString,所以我想将其移动到boost::thread ctor。
主线程或veryLongString 的范围可能在新线程完成之前结束,因此不能通过引用传递(例如使用boost::ref)。
显然,如果veryLongString 被创建为shared_ptr<std::string>,那么我可以将shared_ptr 复制到线程ctor 中,但事实并非如此,所以无论如何我都需要复制它。
我怎样才能[boost::]move() veryLongString 进入boost::thread ctor(可能通过boost::bind 使用)?
这可能吗?
【问题讨论】:
-
我不确定我是否完全理解您的问题。但是如果我这样做了,那么一旦主线程超出范围,veryLongString 就会随之而来,破坏字符串并在新线程内创建一个悬空引用。我更新了问题以反映这一点。
-
这听起来像是您为某些特殊处理创建了一个线程,而不是与主线程分离的“守护程序”线程。因此,主线程在处理线程之前退出的情况听起来很可疑。
-
至于你的问题,为什么不将字符串作为引用传递给构造函数,并在构造函数中使用
boost::move将内容移动到内部字符串? -
@Joachim Pileborg:实际上,这是一个异步调用,被发送出去完成它的工作。完成后它将调用完成处理程序/延续。主线程并没有真正退出,但
veryLongString确实超出了处理其他事情的范围。但是,我正在使用一个函数来完成这项工作。如果我使用可调用对象,我可以按照您的建议做,我不知道为什么我没有想到这一点!我什至不需要boost::move,我只需swap字符串即可。将您的第二条评论作为答案,我会将其标记为 the 答案。
标签: c++ boost boost-thread stdstring boost-move