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 は必要に応じて別の選択肢を提供します。