2016-09-13 59 views
1

我知道從OpenMP中的共享變量讀取不會導致競爭狀態,因爲每個線程都有自己的該變量副本。 但是,如果共享變量是一個指針(例如一個容器),那麼每個線程只會獲得一個指針的副本。從指針讀取時OpenMP競爭狀態

如果我現在從指針指向(我的容器)的位置讀取,是否可以存在競爭條件或OpenMP以某種方式處理此問題?

在線程之間共享容器本身的副本,而不是指向它的指針會更好嗎?

+1

OpenMP線程擁有自己的_private_變量實例,而不是_shared_。如果您沒有正確使用它,任何共享變量用法都會導致競爭。 – ilotXXI

回答

1

只是從變量讀取不能產生競爭條件:變量是否共享並不重要。爲了產生競爭條件,你需要有兩個或更多的線程試圖同時修改同一個變量的實例。

然後,假設你的線程正在讀取和修改某個變量,如果你讓這個變量共享,你將仍然有一個競爭條件,因爲所有線程共享同一個實例。正如@ilotXXI所指出的那樣,我想你的第一段中想說的是私密的。

關於您關於私有化指針的問題,如果該指針的兩個或多個實例指向相同的數據並且對其進行修改,那麼您將會遇到競爭條件(每個線程都有私有版本的指針,但不是私有的數據版本)。

請注意,從一個數據共享子句更改爲另一個可能會改變您的應用程序的行爲。因此,一般來說,當你並行化一個應用程序時,你首先要做的是分析你的應用程序正在執行哪種數據訪問。一旦你知道了,你必須考慮應該使用哪些數據共享子句和哪些同步結構(如果需要)來保持應用程序的原始行爲。