スレッドが競合しない。
Posted: 2013年7月07日(日) 22:48
初めて利用させて頂きます。
スレッドを学習していたところ、出力結果がなぜそうなるのか理解できないため質問します。
今回組んだのは、スレッドを2つ用意し同じ変数にアクセスしてreadとwriteを行うようなものです。
コードは次のようになります。
これを実行すると結果は0となります。片方が1000回インクリメントし、片方が1000回デクリメントするので当然と言えばそうなのですが、独立して動いてるはずのスレッドなのにかかわらずなぜインタリーブが起きないのでしょうか。A.read→B.read→A.write→B.writeとなる可能性だってあると思うのですが・・・
いろいろ調べると、同期プリミティブやセマフォ、条件変数など同期するための方法は出てきたのですが、自動で同期するような事は見つかりませんでした。
また、プリミティブ型への読み、書きは特定アーキテクチャ上では原子性が保証されること。などの情報は出て来ましたが、今回の場合はread→インクリメントorデクリメント→writeですし、ここまで原子性が保証されることは無いと思うのですがどうでしょう。
環境はホストがwindows7 64bit i5-2520mでvmwareのゲストがlinuxでコアの割り当ては2としています。cの実行はlinuxのgnome端末から行なっています。コンパイルにはgccを使用しています。
Cの理解度はほとんど文法などを知らない程度ですが、JavaやRubyなどは組めるのでプログラミング自体には慣れています。毎回やりたいことを検索し、でてきた情報を頼りに組んでいる感じなのでものすごい基礎の事を聞いているかもしれませんが、よろしくお願いします。
また、もう一つ別の質問があるのですが、別のトピックを立てたほうがよろしいのでしょうか?
スレッドを学習していたところ、出力結果がなぜそうなるのか理解できないため質問します。
今回組んだのは、スレッドを2つ用意し同じ変数にアクセスしてreadとwriteを行うようなものです。
コードは次のようになります。
#include <stdio.h>
#include <pthread.h>
static int count = 0;
void *threadA(void *arg)
{
int i;
int tmp;
for(i = 0; i < 1000; i++){
tmp = count;
tmp = tmp + 1;
count = tmp;
}
return NULL;
}
void *threadB(void *arg)
{
int i;
int tmp;
for(i = 0; i < 1000; i++){
tmp = count;
tmp = tmp - 1;
count = tmp;
}
return NULL;
}
int main()
{
pthread_t a, b;
pthread_create(&a,NULL,threadA,NULL);
pthread_create(&b,NULL,threadB,NULL);
pthread_join(a, NULL);
pthread_join(b, NULL);
printf("count = %d\n", count);
return 0;
}
いろいろ調べると、同期プリミティブやセマフォ、条件変数など同期するための方法は出てきたのですが、自動で同期するような事は見つかりませんでした。
また、プリミティブ型への読み、書きは特定アーキテクチャ上では原子性が保証されること。などの情報は出て来ましたが、今回の場合はread→インクリメントorデクリメント→writeですし、ここまで原子性が保証されることは無いと思うのですがどうでしょう。
環境はホストがwindows7 64bit i5-2520mでvmwareのゲストがlinuxでコアの割り当ては2としています。cの実行はlinuxのgnome端末から行なっています。コンパイルにはgccを使用しています。
Cの理解度はほとんど文法などを知らない程度ですが、JavaやRubyなどは組めるのでプログラミング自体には慣れています。毎回やりたいことを検索し、でてきた情報を頼りに組んでいる感じなのでものすごい基礎の事を聞いているかもしれませんが、よろしくお願いします。
また、もう一つ別の質問があるのですが、別のトピックを立てたほうがよろしいのでしょうか?