我正在尝试列出解决方案以threading.Event
在 C 中实现 Python [1] 的功能。
通常,当需要线程之间的同步时,第一个使用/解释的机制是锁(又名互斥锁)。python 的threading.Event
类是另一种同步机制,可用于原子地阻塞线程,直到特定条件为真。
我认为使用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--;
}
}
}
如您所见,我可以得到与 Python 类似的效果threading.Lock
(#pragma omp critical
在我用它保护的示例中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