回到主线程

时间:2014-03-15 19:39:28

标签: c++ multithreading boost

我在多线程方面遇到了问题。每当我为状态机创建新线程时,以及在从一个状态转换到另一个状态期间。在其中一个州" 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的实现有关吗?或者我做错了。

非常感谢。

1 个答案:

答案 0 :(得分:0)

假设mMihf是boost::asio::io_service,则将在运行io_service::run()的线程上调用回调。

如果有多个线程正在运行io_service,则其中一个线程将接收回调执行。

如果你想要更多控制