2011-04-14 39 views
1

我有一個使用Pthread和OpenMP的程序。基本上,使用Pthreads創建2個線程(線程A和B),在線程A中,OpenMP用於並行化for循環。在OpenMP和Pthread中使用鎖定

如果我有一個由OpenMP線程和線程B訪問的全局變量,我可以使用OpenMP中的鎖來確保我沒有競爭條件嗎?

我想到什麼:

int count = 0; 

pthread_create(&ThreadA, &attr, WorkA, NULL); 
pthread_create(&ThreadB, &attr, WorkB, NULL); 

void *WorkA (void *t) 
{ 
    #pragma omp parallel for 
    for (i = 0 ; i < N ; i++) 
    { 
     // Do some work 
     #pragma omp critical 
     { 
     // Do some other work 
     OMP_SET_LOCK(&lock); 
     count++; 
     OMP_UNSET_LOCK(&lock); 
     } 
    } 
} 

void *WorkB (void *t) 
{ 
    if (count > 0) 
    { 
     OMP_SET_LOCK(&lock); 
     count--; 
     OMP_UNSET_LOCK(&lock); 
     // Do some work 
    } 
} 

謝謝。

回答

1

根據OpenMP實現,底層代碼可能會使用pthread。也就是說,OpenMP規範並未說明不同的線程模型是否會「很好地融合在一起」。這可能會也可能不會,取決於您使用的實施是否完成了允許的工作。不幸的是,我只能說,是檢查你正在使用的產品的文檔,看看它是否有任何說明。我相信大多數實現都試圖讓這個工作。

1

使用原子操作來改變計數。首先,使用互斥鎖來保護簡單的++或 - 是不必要的。互斥體用於保護任何其他方式無法以原子方式完成的任何事情。其次,在我看來,表現= 1 /((鎖定)^ 5)。即鎖定會迅速成爲線程應用程序中性能問題的根源,因此請避免它們。第三......原子操作將與OpenMP一起玩。使用__sync_add_and_fetch或類似的原子操作來改變計數。它在芯片上的硬件上實現,所以它的速度只比++或慢了大約2倍,而使用互斥鎖時速度要慢大約40倍。