【发布时间】:2013-03-26 23:09:05
【问题描述】:
我正在尝试列出解决方案以在 C 中实现 Python threading.Event [1] 的功能。
通常,当需要线程之间的同步时,要使用/解释的第一个机制是锁(又名互斥锁)。 python 的threading.Event 类是另一种同步机制,可用于原子地阻塞线程,直到特定条件为真。
对于pthread,我认为可以通过条件变量属性[2]来做到这一点。
omp呢,这可能吗?根据 python 中发生的情况,我用 fictional 类型 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
【问题讨论】:
-
对于它的价值,我认为 OpenMP 没有任何像事件这样的概念;你当然可以使用锁 (
omp_lock_t) 并明确地旋转等待它们直到它们被取消设置,如果这足够好的话。 -
@JonathanDursi 是的,但这不是一个好主意。想象一下像这样的程序在生产服务器上 24/7 运行......电费会使一切破产哈哈