2.6.24.3 カーネルを使用して、組み込み Linux プロジェクトのユーザー空間アプリに取り組んでいます。私のアプリは、非同期 IO 操作が完了するまでそれぞれがスリープする 2 つの pthread を作成することにより、2 つのファイル ノード間でデータを渡します。
完了ハンドラーは、保留中の転送の数を追跡し、1 つのスレッドが追加し、もう 1 つのスレッドが削除するいくつかのリンクされたリストを維持する必要があります。
// sleep here until events arrive or time out expires
for(;;) {
no_of_events = io_getevents(ctx, 1, num_events, events, &timeout);
// Process each aio event that has completed or thrown an error
for (i=0; i<no_of_events; i++) {
// Get pointer to completion handler
io_complete = (io_callback_t) events[i].data;
// Get pointer to data object
iocb = (struct iocb *) events[i].obj;
// Call completion handler and pass it the data object
io_complete(ctx, iocb, events[i].res, events[i].res2);
}
}
私の質問はこれです...
ミューテックス/スピンロックルートを下るのではなく、完了ハンドラーを実行している間、現在アクティブなスレッドが譲歩するのを防ぐ簡単な方法はありますか?
または、ミューテックス/スピンロックが保持されているときに pthread を生成しないように Linux を構成できることに失敗しましたか?