2012-05-09 14 views
2

現在、pthreadsを使用しています。スレッドの1つにrun()メソッドがあります。 run()メソッドは、ベクトルの最初の要素の開始時間をチェックし、その時間に達するまでブロッキングスリープを実行して、他のスレッドを実行できるようにする必要があります。問題は、ベクトルのフロント要素が更新可能で、run()メソッドでタイマーをリセットする必要があることです。私はこの問題にどう対処するかについて本当にわかりません。私はそれが以前の時間に更新されている可能性がある最後のチェックの開始時間まで待つので、スリープを使用することはできません。Pthreadブロック/更新可能タイマー

答えて

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の目を覚ますためにこのように私たちのスレッドは、条件変数を使うよりも何倍も高速でした。

関連する問題