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;
}