我正在尝试列出一些解决方案,以便在C中实现Python threading.Event
[1]的功能。
通常,当需要线程之间的同步时,要使用/解释的第一个机制是Lock(aka mutex)。 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--;
}
}
}
正如您所看到的,我可以使用threading.Lock
获得类似Python #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
答案 0 :(得分:0)
注意:此解决方案不正确。在这个答案的最后看看编辑。
嗯......我想我已经找到了怎么做。看一下Python的线程模块的来源,[1],实际上看起来很简单。
保持可重入锁的 FIFO (在OpenMP中实现为omp_nest_lock_t
)。每当调用Event.wait([timeout])
时,新锁将附加到 FIFO 并立即获取两次(第二次将阻塞,直到第一次被释放!) 。
然后,当调用Event.set()
时, FIFO 中的所有锁都将被释放并从中删除。
我希望这个答案对将来遇到这个问题的人有用。
[1] http://svn.python.org/projects/python/branches/py3k/Lib/threading.py
编辑:我发现一篇文章说这个解决方案不正确并且讨论了这个问题:[2] http://www.michaelsuess.net/publications/wirz_suess_leopold_taskpools_06.pdf