2013-03-26 102 views
3

我试图使解决方案的列表来实现的Python的threading.Event [1] C.在OpenMP中是否有类似于Python的threading.Event的机制?

通常情况下,需要线程之间的同步时,要使用的第一种机制/解释的功能被锁(又名互斥体)。 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#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

+0

对于它的价值,我不认为OpenMP有像事件这样的概念;你当然可以使用锁('omp_lock_t')并明确地旋转等待它们直到它们未被设置,如果这足够好的话。 – 2013-03-27 01:21:01

+0

@JonathanDursi是的,但这不是一个好主意。想象一下类似于运行在生产服务器上的程序24/7 ...电费账单会破坏一切哈哈 – ffunenga 2013-03-27 01:27:18

回答

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

相关问题