GNU/Linux >> Linux の 問題 >  >> Linux

LinuxでWaitForSingleObjectとWaitForMultipleObjectsは同等ですか?

pthread_cond_timedwait に固執する clock_gettime を使用します .例:

struct timespec ts;
clock_gettime(CLOCK_REALTIME, &ts);
ts.tv_sec += 10; // ten seconds
while (!some_condition && ret == 0)
    ret = pthread_cond_timedwait(&cond, &mutex, &ts);

必要に応じて関数でラップしてください。

更新:コメントに基づいて回答を補足します。

POSIX には、Windows のように「すべてのタイプ」のイベント/オブジェクトを待機する単一の API はありません。それぞれに独自の機能があります。スレッドに終了を通知する最も簡単な方法は、アトミック変数/操作を使用することです。例:

メインスレッド:

// Declare it globally (argh!) or pass by argument when the thread is created
atomic_t must_terminate = ATOMIC_INIT(0);

// "Signal" termination by changing the initial value
atomic_inc(&must_terminate); 

二次スレッド:

// While it holds the default value
while (atomic_read(&must_terminate) == 0) {
    // Keep it running...
}
// Do proper cleanup, if needed
// Call pthread_exit() providing the exit status

もう 1 つの方法は、pthread_cancel を使用してキャンセル リクエストを送信することです。 .キャンセルされるスレッドは pthread_cleanup_push を呼び出している必要があります 必要なクリーンアップ ハンドラを登録します。これらのハンドラーは、登録された順序と逆の順序で呼び出されます。 pthread_exit を呼び出さないでください 未定義の動作であるため、クリーンアップ ハンドラーから。キャンセルされたスレッドの終了ステータスは PTHREAD_CANCELED です .この代替案を選択する場合は、主にキャンセル ポイントとタイプについて読むことをお勧めします。

そして最後に pthread_join を呼び出します 引数で渡されたスレッドが終了するまで、現在のスレッドをブロックします。おまけとして、スレッドの終了ステータスを取得できます。


私たち (NeoSmart Technologies) は、POSIX で WIN32 の手動および自動リセット イベントを実装し、WaitForSingleObject と WaitForMultipleObjects の両方のクローンを含む、pevents と呼ばれるオープン ソース (MIT ライセンス) ライブラリをリリースしました。

個人的には、POSIX マシンでコーディングする場合は POSIX マルチスレッドとシグナリング パラダイムを使用することをお勧めしますが、pevents は必要に応じて別の選択肢を提供します。


Linux
  1. Linuxでの名前空間とコンテナの謎を解き明かす

  2. Linux – Unix / linux Osesの標準および/または共通ディレクトリ?

  3. Linuxでスレッドに名前を付ける方法は?

  1. Linuxコマンド:jobs、bg、およびfg

  2. Linux – SysfsとDevtmpfs?

  3. Linuxはロボコピーに相当しますか?

  1. Linux ファイルとディレクトリの削除

  2. Linux および gcc 4 での C++ の新しい演算子のスレッド セーフ

  3. cp および mv での Linux ワイルドカードの使用