2014年12月29日月曜日

開発環境

コンピュータプログラミングの概念・技法・モデル(IT Architect' Archiveクラシックモダン・コンピューティング6) (IT Architects’Archive CLASSIC MODER)(セイフ・ハリディ (著)、ピーター・ヴァン・ロイ (著)、Peter Van-Roy (著)、 Seif Haridi (著)、羽永 洋 (翻訳) 、翔泳社、原書: Concepts, Techniques, and Models of Computer Programming(CTM))の第1章(プログラミング概念入門)、1.18(練習問題)、10-a, b.(明示的状態と並列性)をC言語で考えてみる。

10-a, b.(明示的状態と並列性)

コード(BBEdit, Emacs)

sample10_b.c

#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <pthread.h>
#include <stopif.h>

int c = 0;

void* inc() {
  int i = c;
  sleep(1);
  c = i + 1;
  return NULL;
}

int main() {
  pthread_t t0;
  pthread_t t1;
  Stopif(pthread_create(&t0, NULL, inc, NULL) == -1, return 1,
         "スレッドt0を作成できません: %s", strerror(errno));
  Stopif(pthread_create(&t1, NULL, inc, NULL) == -1, return 1,
         "スレッドt1を作成できません: %s", strerror(errno));
  void *result;
  Stopif(pthread_join(t0, &result) == -1, return 1,
         "スレッドt0をジョインできません: %s", strerror(errno));
  Stopif(pthread_join(t1, &result) == -1, return 1,
         "スレッドt1をジョインできません: %s", strerror(errno));
  sleep(10);
  printf("%i\n", c);
}  

sample10_b_before.c

#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <pthread.h>
#include <stopif.h>

int c = 0;

void* inc() {
  sleep(1);
  int i = c;
  c = i + 1;
  return NULL;
}

int main() {
  pthread_t t0;
  pthread_t t1;
  Stopif(pthread_create(&t0, NULL, inc, NULL) == -1, return 1,
         "スレッドt0を作成できません: %s", strerror(errno));
  Stopif(pthread_create(&t1, NULL, inc, NULL) == -1, return 1,
         "スレッドt1を作成できません: %s", strerror(errno));
  void *result;
  Stopif(pthread_join(t1, &result) == -1, return 1,
         "スレッドt1をジョインできません: %s", strerror(errno));
  Stopif(pthread_join(t0, &result) == -1, return 1,
         "スレッドt0をジョインできません: %s", strerror(errno));
  printf("%i\n", c);
}  

入出力結果(Terminal)

$ crun.sh sample10_b
...
1
$ ./sample10_b && ./sample10_b && ./sample10_b && ./sample10_b && ./sample10_b 
1
1
1
1
1
$ crun.sh sample10_b_before
...
2
$ ./sample10_b_before && ./sample10_b_before && ./sample10_b_before && ./sample10_b_before && ./sample10_b_before && ./sample10_b_before && ./sample10_b_before && ./sample10_b_before && ./sample10_b_before && ./sample10_b_before
2
2
1
2
1
2
2
2
2
2
$

0 コメント:

コメントを投稿