簡體   English   中英

在OpenMP中是否有與Python的threading.Event類似的機制?

[英]Is there a similar mechanism to Python's threading.Event in OpenMP?

我正在嘗試列出一些解決方案來實現C中Python的threading.Event [1]的功能。

通常,當需要線程之間的同步時,要使用/解釋的第一個機制是鎖(也就是互斥)。 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--;
        }
    }
}

正如你所看到的,我可以得到類似Python的threading.Lock效果。 nthreads #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

注意:此解決方案不正確。 在這個答案的最后看看編輯。

嗯......我想我已經找到了怎么做。 看一下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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM