我在多线程方面遇到了问题。每当我为状态机创建新线程时,以及在从一个状态转换到另一个状态期间。在其中一个州" ho_preparation_state" ,状态机必须调用一个异步发送请求消息的函数,并为响应分配一个处理程序,如下所示:
void src_transaction::run()
{
ho_preparation_state:
{
// Serialize a MIH N2N_HO_Commit Request
m << mih::request(mih::request::n2n_ho_commit)
& mih::tlv_mobile_node_mihf_id(mobile_id)
& mih::tlv_mn_link_id(mn_addr)
& mih::tlv_poa(poa_addr)
& mih::tlv_request_resource_set(request_res);
// The destination is the target Cloud-Server
m.destination(dst);
// The handler is n2n_ho_commit_confirm_handler
mMihf->async_send(m, boost::bind(&src_transaction::n2n_ho_commit_confirm_handler, this, _1, _2));
goto ho_commit_confirm_state;
}
}
处理程序是State Machine类的一部分&#34; src_transaction&#34;:
void src_transaction::n2n_ho_commit_confirm_handler(mih::message &msg, const boost::system::error_code &ec)
{
if (ec)
{
log_(0, __FUNCTION__, " error: ", ec.message());
return;
}
mih::status st;
mih::id mobile_id; // Mobile node MIHF ID TLV
mih::link_tuple_id target_id;;
mih::asgn_res_set res_set;
// Deserialize the received MIH message
msg >> mih::confirm()
& mih::tlv_status(st) // Status of operation.
& mih::tlv_mobile_node_mihf_id(mobile_id)
& mih::tlv_link_identifier(target_id)
& mih::tlv_assigned_resource_set(res_set);
log_(0, "has received a N2N_Handover_Commit.Confirm with status ", st.get(), " For Mobile IP=", mobile_id.to_string());
if (st == mih::status_success)
{
ho_commit_confirm_received = true;
run();
}
}
我发现,当状态机进行回调时。它改回主线程。例如,运行一切的主线程有PID = 0x267890, 创建新的状态机线程时,它将具有新的PID = 0x267B90。在所有转换期间,每当我打印出PID为0x267B90,但是当调用处理程序时,运行它的PID是主线程的PID,PID = 0x267890。
为什么会发生这种情况?它可能与async_send的实现有关吗?或者我做错了。
非常感谢。
答案 0 :(得分:0)
假设mMihf是boost::asio::io_service
,则将在运行io_service::run()
的线程上调用回调。
如果有多个线程正在运行io_service
,则其中一个线程将接收回调执行。
如果你想要更多控制
io_service
限制为单个帖子io_service
(例如ui_service
表示ui线程,workers_service
表示工作线程。考虑一下可扩展性要求,但