2012-02-13 9 views
16

私は次のようにのOpenMPを使用したい対象のいくつかのコードを持っている:のOpenMPおよびSTLベクトル

std::vector<int> v(1000); 
# pragma omp parallel for 
for (int i = 0; i < 1000; ++i) { 
    v[i] = i; 
} 

私はSTLのベクトルコンテナはどこな状況ではスレッドセーフではないことを読んだことがあります複数のスレッドが単一のコンテナに書き込むと、書き込みを行う前にベクトルをロックする必要があることを意味します。しかし、私はまた、上記の書き込み操作は何らかの形で「アトミック」であると言われているので、上記の競合条件はありません。誰かがこれを明確にすることができますか?

+0

複数の読み取り、書き込みを許可するconcurrent_vectorを確認してください – user

答えて

26

この特定の例では、安全です。

理由は、再割り当ての原因となる操作を使用していないためです。 (例えば、push_back())。個々の要素の内容を変更するだけです。あなただけのように合法的にこれを行うことができます

注:あなたが呼び出すメソッドを起動したときに

std::vector<int> v(1000); 
int *ptr = &v[0]; 

# pragma omp parallel for 
for (int i = 0; i < 1000; ++i) { 
    ptr[i] = i; 
} 

はそれがないスレッドセーフとなり、複数のスレッドからpush_back()pop_back()insert()、等...のような。

この特定の例は、実行する作業がほとんどないため、並列処理にはあまり適していないとも付け加えます。しかし、私はそれがこの質問をする目的のためにちょっとばかげた例だと思う。

+0

すばやく応答してくれてありがとう! – cbd

+4

"ベクトル自体を変更しない" - > "再割り当ての原因となる操作を使用しない"。しかし、とにかく+1。 –

+0

@larsmansはい、それは私が使ったより良い言葉です。 :)私はそれを変更します。ありがとう。 – Mysticial

0

複数の読み取りは安全ですが、同じコンテナへの複数の書き込みを避けることをおすすめします。しかし、自分で管理するメモリに書き込むことができます。ベクタとの違いは、メモリが同時に変更されたり再割り当てされないことを確かめることができることです。それ以外の場合は、セマフォを使用することもできますが、効率が低下する可能性があります。複数使用すると、正しく動作しないとデッドロックが発生する可能性があります。

関連する問題