上記について実際に動かして調べました。

パターン1: remote_core_launchをtryに囲む

void func() /* user implementation */
{
throw exception;
}

int main() /* developer implementation */
{
dpdk_init();
try {
remote_core_launch(func);
} catch (e) {
printf(e.what());
}
}

これでは例外をキャッチできないが、一応普段どおりに terminate called after throwing an instance of ‘hogehoge’ してくれるので壊れたり(余談参照)しなかった。

余談: DPDK使ってるときに極まれにDPDKの秘孔をついてNICが使えなくなることが セキュリティキャンプであったので。(本当にDPDKの秘孔が原因か解らないけど。。)

パターン2: すべての処理の一番上からtryで囲む

void func() /* user implementation */
{
throw exception;
}

int main() /* developer implementation */
{
try {
dpdk_init();
remote_core_launch(func);
} catch (e) {
printf(e.what());
}
}

これでも例外はキャッチできない。 なおterminate called after throwing an instance of ‘hogehoge’はしてくれる

パターン3: remote_core_launchする関数をラップする

void func() /* user implementation */
{
throw exception;
}

void wrap_func() /* developer implementation */
{
try {
func();
} catch (e) {
printf(e.what());
}
}

int main() /* developer implementation */
{
dpdk_init();
remote_core_launch(wrap_func);
}

これで例外をしっかりキャッチできる

まとめ

STCPではパターン3を採用して実装する。 これが一番ベターな感じがするなあ。