2017-02-23 6 views
2

複数のスレッドで構成される最初のコンポーネントがロックされたロックを待機し、2番目のコンポーネントがロックを受け取りロックを解除すると、それを待つ他のすべてのスレッドにシグナルを送りますか?ロック解除時に複数のスレッドを通知する1つのロック

クロスプラットフォームにする必要があります(C言語で実装されます)。

このようなことを設計する方法はありますか?

+0

これらのスレッドがまだ待機中であることを通知するポイントは何ですか? – StoryTeller

+0

ロック以外の操作を行うためにロックを使用しないでください。シグナルを送信する場合は、セマフォ、条件変数などを使用してください –

+0

これらのスレッドは、2番目のコンポーネントが正常に終了するまで待機し、完了したら作業を続行できます – Drxxd

答えて

1

ターゲットシステムであると仮定して、POSIXシステムとWindowsシステムの両方で使用できるクロスプラットフォームソリューションはありません。 POSIXシステムで

、条件変数を使用すると、すべての待機中のスレッドのブロックを解除するpthread_cond_broadcast()を呼び出します。

これらの関数は、スレッドのブロックを解除するものと

SYNOPSIS

#include <pthread.h> 

int pthread_cond_broadcast(pthread_cond_t *cond); 
int pthread_cond_signal(pthread_cond_t *cond); 

説明条件変数でブロックされます。

pthread_cond_broadcast()関数は、指定された条件変数condで現在ブロックされているすべてのスレッドのブロックを解除します。

... Windows上で

you can use WakeAllConditionVariable

ウェイク指定された条件変数で待機しているすべてのスレッド。

構文

C++

VOID WINAPI WakeAllConditionVariable(
    _Inout_ PCONDITION_VARIABLE ConditionVariable 
); 

これは、Windows上のPOSIXシステムと、Windowsの状態変数にPOSIXの条件変数をラップ独自のクロスプラットフォームの状態変数ラッパーを書くのはそんなに難しいことではありませんシステム。

+0

クール、それは私の問題を解決するようだ..この条件変数が機能するためには、スレッドごとにロックを作成する必要があります(何もしません)。ところで、これらの条件変数にはタイムアウトの仕組みがあります(POSIX?) – Drxxd

+0

Nvm、私は条件変数にタイムアウトを持つ "pthread_cond_timedwait"を発見しました。何もしない。 – Drxxd

+0

POSIX条件変数に必要なmutexは、「何もしません」。 POSIX条件変数を使用する方法の多くの例があります:https://www.google.com/search?q=pthread_cond_wait+example –

関連する問題