2017-06-28 4 views
1

pthreadで作業を開始したときに最初に言われたのは、pthread_cancelのような強制的なスレッド取り消しを避けるべきです。代わりに、スレッド通信チャネルを介してスレッドキャンセル通知を使用する必要があります。POSIXスレッド:最高の中断方法

スレッドで実行するのに本当に長いタスクがある場合は、このチャンクを小さなチャンクに分割し、チャンク処理ごとにキャンセルフラグをチェックします。このように:

しかし、このcheck_cancel_flag()関数の実装にはどのような方法が最適ですか?

  1. (あなたが唯一つの作業スレッドを使用している場合)あなたはキャンセルフラグの型としてsig_atomic_t使用することができます。

    CとLinuxのすべての私の経験では、私はそれらのメソッドを思い出すことができます。 check_cancel_flag()関数でそれをチェックし、スレッドのシグナルハンドラでtrueとマークします。それから、メインスレッドからpthread_killを呼び出してください。

  2. キャンセルフラグには任意のPODタイプを使用し、それをミューテックスで保護します。この場合、ロックを頻繁に呼び出すとオーバーヘッドが発生します。

  3. キャンセルフラグとしてmutexを使用します。 pthread_mutex_trylock呼び出しで確認してください。メインスレッドがこのミューテックスを解放する場合、ワーカースレッドのシャットダウンが必要です。

  4. (C11の場合)キャンセルフラグを設定して確認するには、gcc _atomic組み込み関数(または別のasmアトミックライブラリ)を使用します。

私は何も覚えていませんでした。

質問:正しいアプローチを選択するにはどうすればよいですか? この問題に関するベンチマークはありますか?

+1

正確な質問について議論する[Wiki記事](https://en.wikipedia.org/wiki/Monitor_%28synchronization%29#Condition_variables)があります。 –

+0

comsumer/producerの実装のためにちょっと違うと思います。実際、私はキューと待機条件を使用しますが、長いタスクを中断する方法はありますか? –

+0

ところで、C11にはトリックを行うデータ型のための単純な '_Atomic'修飾があります。 'sig_atomic_t'は決して適切ではなく、その唯一の保証はシグナルハンドラに関するものであり、そこには不可分性しか保証されていません。 –

答えて

2

フラグを保護するためにリーダーワーカーロック(pthread_rwlock_t)を使用する方法があります。ワーカースレッドは頻繁に読む必要がありますが、一度だけ書き込まれるためです。

フラグのチェックの間に処理されるチャンクが小さすぎない限り、オーバーヘッドは重要ではありません。

関連する問題