現在、pthreadsを使用しています。スレッドの1つにrun()メソッドがあります。 run()メソッドは、ベクトルの最初の要素の開始時間をチェックし、その時間に達するまでブロッキングスリープを実行して、他のスレッドを実行できるようにする必要があります。問題は、ベクトルのフロント要素が更新可能で、run()メソッドでタイマーをリセットする必要があることです。私はこの問題にどう対処するかについて本当にわかりません。私はそれが以前の時間に更新されている可能性がある最後のチェックの開始時間まで待つので、スリープを使用することはできません。Pthreadブロック/更新可能タイマー
2
A
答えて
0
ベクトルを更新している間は、スリープスレッドに何らかの信号を送る必要があります。これを行うには十数の方法がありますが、2つの明白なものは条件変数であり、selectをパイプまたは同様のものと使うだけです。
条件変数を使用すると、pthread_cond_timedwait
と計算されたタイムアウト値を使用できます。それがタイムアウトすれば、大丈夫です。シグナルが出たら、ベクターを読んで、タイムアウトを再計算し、ブロックする必要があります。
同様に、select()
では、ベクトルからのタイムアウト値を計算して使用し、タイムアウトやパイプ上の入力を待っている間にブロックします。ベクトルを更新することによってパイプに何かが書き込まれ、スレッドが起動し、再計算されます。
1
pthread_kill()を使用して、sigtimedwait()でスリープしている特定のスレッドをスリープ解除することができます。
sigset_t _fSigMask; // global sigmask
スレッドを作成する前にこれを行います。スレッドはシグナルマスクを生成するスレッドからシグナルマスクを継承します。 SIGUSR1を使ってスレッドに信号を送ります。他の信号も利用可能です。
その後sigemptyset(&_fSigMask);
sigaddset(&_fSigMask, SIGUSR1);
sigaddset(&_fSigMask, SIGSEGV);
スレッド寝る:眠っていると目覚め、
pthread_kill(pThread, SIGUSR1);
ところで、私たちのテスト中:
int nSig;
struct timespec tmTimeout = { nSec, nNanoSec }; // from your vector of times
sigtimedwait(&fSigMask, &nSig, &tmTimeout);
をそれからちょうどそれを合図、スレッド、pthreadの目を覚ますためにこのように私たちのスレッドは、条件変数を使うよりも何倍も高速でした。
関連する問題
- 1. リセット可能なタイマーでSystem.Reactive
- 2. 更新可能なビュー(オラクル)
- 3. 更新可能なドロップターゲットjquery.event.drag
- 4. フルページキャッシュ、ブロック更新
- 5. 更新ギャラリー/リストビューアイテムビューからタイマー
- 6. pthreadの機能
- 7. Azureタイマー機能がログを更新しない
- 8. タイマー付きの更新パネルのボタンが機能しません
- 9. 変更可能なHashMap値を変更可能なコレクションで更新します。
- 10. 角度2の再スタート可能なタイマー
- 11. 非ブロックIOコールのaspectjタイマー
- 12. フィルターストリームからNULL値可能な値と更新NULL可能プロパティ
- 13. Jquery UIソート可能なリストの更新
- 14. PHPの更新可能な変数
- 15. VBA Excel - アクセスクエリが更新不可能
- 16. 取得Zend_Db_Table_Abstract ::更新()の可能なバグ
- 17. はNPM「更新可能な」メッセージ
- 18. Accessデータベース(DDL)のバッチ更新。可能?
- 19. angularJSの自動更新可能な値
- 20. ページ更新時のタイマーの問題
- 21. javascriptのタイマーとCSS位置の更新
- 22. タイマーでUILabelを更新しない
- 23. リアルタイム更新機能によって更新可能なフィールドのリスト?
- 24. CのPthreadバリアは再利用可能ですか?
- 25. x_npの利用可能なテストpthread関数 - C/C++
- 26. pthreadスリープ機能、CPU消費
- 27. ラップ可能な中央のブロック
- 28. Nginxの再利用可能なブロック
- 29. Silverstripe 3.2再利用可能なブロック
- 30. 証言ブロック/再利用可能