2

我正在尝试列出解决方案以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

4

1 回答 1

0

注意:此解决方案不正确。查看此答案末尾的编辑。

嗯...我想我已经找到了方法。查看 Python 的线程模块的源代码,[1],实际上看起来很简单。

它的问题是保持FIFO可重入锁(在 OpenMP 中实现为omp_nest_lock_t)。每当Event.wait([timeout])调用 a 时,一个新的锁被附加到FIFO并立即获得两次(第二次将阻塞,直到第一次被释放!)。然后,当被调用时, FIFOEvent.set()中的所有锁都会被释放并从中移除。

我希望这个答案对将来遇到此问题的任何人都有用。

[1] http://svn.python.org/projects/python/branches/py3k/Lib/threading.py

编辑:我发现一篇文章说这个解决方案不正确并谈到了这个问题:

[2] http://www.michaelsuess.net/publications/wirz_suess_leopold_taskpools_06.pdf

于 2013-03-27T14:51:45.913 回答