我試圖使解決方案的列表來實現的Python的threading.Event
[1] C.在OpenMP中是否有類似於Python的threading.Event的機制?
通常情況下,需要線程之間的同步時,要使用的第一種機制/解釋的功能被鎖(又名互斥體)。 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
與#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')並明確地旋轉等待它們直到它們未被設置,如果這足夠好的話。 – 2013-03-27 01:21:01
@JonathanDursi是的,但這不是一個好主意。想象一下類似於運行在生產服務器上的程序24/7 ...電費賬單會破壞一切哈哈 – ffunenga 2013-03-27 01:27:18