[英]Is there a similar mechanism to Python's threading.Event in OpenMP?
我正在嘗試列出一些解決方案來實現C中Python的threading.Event
[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
效果。 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.