在OpenMP中是否有与Python的threading.Event类似的机制?

时间:2013-03-26 23:09:06

标签: python c openmp

我正在尝试列出一些解决方案,以便在C中实现Python threading.Event [1]的功能。

通常,当需要线程之间的同步时,要使用/解释的第一个机制是Lock(aka mutex)。 python的threading.Event类是另一种同步机制,可用于原子地阻塞线程,直到特定条件为真。

使用pthread我认为可以使用条件变量属性[2]来实现这一点。

omp怎么样,这可能吗?根据python中发生的情况,我用虚构类型EventEventsQueue编写了以下示例:

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

1 个答案:

答案 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