threading.Event
Pythonの[1]の機能をCで実装するためのソリューションのリストを作成しようとしています。
通常、スレッド間の同期が必要な場合、使用/説明される最初のメカニズムはロック(別名ミューテックス)です。Pythonのthreading.Event
クラスは、特定の条件が真になるまでスレッドをアトミックにブロックするために使用できる同期のもう1つのメカニズムです。
これpthread
は、条件変数属性[2]を使用してこれを行うことが可能だと思います。
どうですかomp
、これは可能ですか?Pythonで何が起こるかに基づいて、架空のタイプEvent
とEventsQueue
:を使用して次の例を作成しました。
int nthreads;
Event *evt;
EventsQueue *queue;
#pragma omp parallel private(evt)
{
#pragma omp single
{
nthreads = omp_get_num_threads()-1;
}
if (!omp_get_thread_num()) /*master thread*/
{
while (nthreads)
{
evt = events_queue_pop(queue);
evt_set(evt);
}
}
else /*other threads */
{
evt = alloc_event();
events_queue_append(queue, evt);
/* each threads waits for master thread to set its event*/
evt_wait(evt);
free_event(evt);
#pragma omp critical
{
nthreads--;
}
}
}
threading.Lock
ご覧のとおり、Pythonと同様の効果を得ることができます#pragma omp critical
(例では、Pythonで保護nthreads
しています)。問題はthreading.Event
です。OpenMPではそのようなものは見つかりません。
[1] http://docs.python.org/2/library/threading.html#event-objects
[2] http://www.cs.cf.ac.uk/Dave/C/node31.html#SECTION003120000000000000000