我试图使解决方案的列表来实现的Python的threading.Event
[1] C.在OpenMP中是否有类似于Python的threading.Event的机制?
通常情况下,需要线程之间的同步时,要使用的第一种机制/解释的功能被锁(又名互斥体)。 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
对于它的价值,我不认为OpenMP有像事件这样的概念;你当然可以使用锁('omp_lock_t')并明确地旋转等待它们直到它们未被设置,如果这足够好的话。 – 2013-03-27 01:21:01
@JonathanDursi是的,但这不是一个好主意。想象一下类似于运行在生产服务器上的程序24/7 ...电费账单会破坏一切哈哈 – ffunenga 2013-03-27 01:27:18