【问题标题】:Is there a similar mechanism to Python's threading.Event in OpenMP?OpenMP 中是否有与 Python 的 threading.Event 类似的机制?
【发布时间】:2013-03-26 23:09:05
【问题描述】:

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

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

对于pthread,我认为可以通过条件变量属性[2]来做到这一点。

omp呢,这可能吗?根据 python 中发生的情况,我用 fictional 类型 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--;
        }
    }
}

如您所见,我可以得到与 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 运行......电费会使一切破产哈哈

标签: python c openmp


【解决方案1】:

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

嗯...我想我已经找到了方法。看Python的threading模块的源码,[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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-30
    • 2020-03-15
    • 2017-05-29
    相关资源
    最近更新 更多