提升主题:使用已删除的函数错误

我想在boost中使用multithreading来处理多个请求,并在接收到特定的消息时,我将创build一个新线程来处理它,如下所示:

main.cpp中


/ **
*目标机器请求处理程序。
*
* @param msg收到消息。
* @参数ec错误代码。
* /
void handover_request_handler(odtone :: mih :: message&msg,const boost :: system :: error_code&ec)
{
如果(ec)
{
log_(0, FUNCTION ,“error:”,ec.message());
返回;
}
//做一些东西
}

void event_handler(odtone :: mih :: message&msg,const boost :: system :: error_code&ec)
{
如果(ec)
{
log_(0, FUNCTION ,“error:”,ec.message());
返回;
}

switch (msg.mid()) { // Destination Cloud Server received HO Commit Message case odtone::mih::indication::n2n_ho_commit: { boost::thread thrd(boost::bind(&handover_request_handler, msg, ec)); thrd.join(); } break; }

}

当我尝试使用b2工具编译它时,出现以下错误:

gcc.compile.c ++ ../../bin.v2/app/lte_mih_usr/gcc-4.6/debug/link-static/runtime-link-static/main.o main.cpp:在函数'void event_handler(odtone: :mih :: message&,const boost :: system :: error_code&)':main.cpp:189:69:error:使用已删除的函数'odtone :: mih :: message :: message(const odtone :: mih :: message&)'从../../inc/odtone/mih/request.hpp:24:0包含的文件中,从main.cpp:11:

那么如何解决这个问题?

非常感谢。

thread构造函数复制其参数,并且message类型不可复制。 要传递目标函数的引用,你需要使用boost::ref(msg)

另外请注意,使用thread bind是不必要的:

 boost::thread thrd(&handover_request_handler, boost::ref(msg), boost::ref(ec)); 

thread构造器实现与bind相同的语义,所以使用bind只是增加了不必要的附加拷贝。