0

iOS プラットフォームで boost.asio、boost.thread などを使用すると、アプリは int リリース モードでクラッシュしましたが、int デバッグ モードでは正常に動作します。こので説明したように、リリース ランタイムのバグを修正します

私の質問は: デバッグ モードですべて問題ないのはなぜですか? 答えは、クラッシュは親指フラグが原因であると言っているようです。デバッグ モードのコンパイラは、リリース モードと同じように "thumb" フラグを使用する必要があります。親指を使用しているため、デバッグ モードでもアプリがクラッシュするのではないかと思います。

更新: asio を使用する私のコードは次のとおりです。

Params は、CrossPlatformAPI のプライベート メンバーとして宣言されます。

boost::recursive_mutex m_mutex;
boost::asio::io_service m_ioService;
boost::scoped_ptr<boost::asio::io_service::work> m_idleWork;
boost::scoped_ptr<boost::thread> m_mainThread;

まず、メイン スレッドで CrossPlatformAPI::Init を呼び出して、2 つの非同期タスクを投稿します。

int CrossPlatformAPI::Init(const P2PInitParam& oInitParam)
{
    boost::recursive_mutex::scoped_lock lock(m_mutex);
    m_idleWork.reset(new boost::asio::io_service::work(m_ioService));
    m_mainThread.reset(new boost::thread(boost::bind( &boost::asio::io_service::run, &m_ioService)));
    std::string strLog(oInitParam.szAppDataDir);
    m_ioService.post(boost::bind( &CrossPlatformAPI::HandleLog, this, strLog));
    m_ioService.post(boost::bind( &CrossPlatformAPI::HandleInit, this, oInitParam)); 
    return 0;
}

次に、CrossPlatformAPI::HandleLog と CrossPlatformAPI::HandleInit が非同期タスクを処理します。

void CrossPlatformAPI::HandleLog(std::string & log)
{
    std::cout << log << std::endl;
}

void CrossPlatformAPI::HandleInit(P2PInitParam& oInitParam)
{
    try
    {
        //Init
        //...
    }
    catch (std::exception&)
    {
    }

    return;
}

直接バインドする代わりに、boost:ref を使用してバインド パラメータをラップしようとしましたが、アプリはクラッシュしません。なぜだめですか?また、バインド パラメーターの型が std::string の場合、std::ref によってラップされたときにハンドル関数が受け取ったパラメーターが正しくないこともわかりません。std::ref を使用しない std::string はうまく機能しているようです: クラッシュせず、受け取った値は正しいですが、 P2PInitParam のような sruct -type パラメータではありません。

UPDATE2 :

int CrossPlatformAPI::Init(const P2PInitParam& oInitParam)
{
    boost::recursive_mutex::scoped_lock lock(m_mutex);
    m_idleWork.reset(new boost::asio::io_service::work(m_ioService));
    m_mainThread.reset(new boost::thread(boost::bind( &boost::asio::io_service::run, &m_ioService)));
    std::string strLog(oInitParam.szAppDataDir);
    m_ioService.post(boost::bind( &CrossPlatformAPI::HandleLog, this, boost::cref(strLog))); // OK
    m_ioService.post(boost::bind( &CrossPlatformAPI::HandleInit, this, boost::cref(oInitParam))); // Crash
    return 0;
}

void CrossPlatformAPI::HandleLog(const std::string& log)
{
    std::cout << log << std::endl;
}

void CrossPlatformAPI::HandleInit(const P2PInitParam& oInitParam)
{
    try
    {
        //Init
        //...
    }
    catch (std::exception&)
    {
    }

    return;
}
4

0 に答える 0