2013-03-26 98 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

相關問題