2014年6月17日火曜日

開発環境

Head First C ―頭とからだで覚えるCの基本(David Griffiths (著)、Dawn Griffiths (著) 中田 秀基(監訳)(翻訳)、木下 哲也 (翻訳)、オライリージャパン)の12章(スレッド: 並列の世界)、長いエクササイズ(p.516)を解いてみる。

その他参考書籍

長いエクササイズ(p.516)

コード(BBEdit, Emacs)

sample516.c

#include <stdio.h>
#include <pthread.h>

#include "drink_lots_a.h"
#include "drink_lots_b.h"
#include "error.h"

int main(int argc, char *argv[])
{
  pthread_t threads[20];
  int t;
  void *result;

  /* バージョンAは1つ目に対応 */
  puts("バージョンA");
  printf("壁にはビールが%i本\n%i本のビール\n", beers_a, beers_a);
  
  for (t = 0; t < 20; ++t)
    if (pthread_create(&threads[t], NULL, drink_lots_a, NULL) == -1)
      error("スレッドを作成出来ません。", 1);

  for(t = 0; t < 20; ++t)
    if (pthread_join(threads[t], &result) == -1)
      error("スレッドをジョイン出来ません。", 1);
  
  printf("現在、壁にはビールが%i本あります。\n", beers_a);

  /* バージョンBは2つ目に対応 */
  puts("バージョンB");
  printf("壁にはビールが%i本\n%i本のビール\n", beers_b, beers_b);
  
  for (t = 0; t < 20; ++t)
    if (pthread_create(&threads[t], NULL, drink_lots_b, NULL) == -1)
      error("スレッドを作成出来ません。", 1);

  for(t = 0; t < 20; ++t)
    if (pthread_join(threads[t], &result) == -1)
      error("スレッドをジョイン出来ません。", 1);
  
  printf("現在、壁にはビールが%i本あります。\n", beers_b);
  
  return (0);
}

Makefile

CC=cc
CFLAGS = -g -Wall
SRC=sample516.c drink_lots_a.c drink_lots_b.c error.c
OBJ=sample516.o drink_lots_a.o drink_lots_b.o error.o

all: sample516

sample516: $(OBJ)
 $(CC) $(CFLAGS) $(OBJ) -o sample516

sample516.o: drink_lots_a.h drink_lots_b.h error.h sample516.c
 $(CC) $(CFLAGS) -c sample516.c -o sample516.o

drink_lots_a.o: drink_lots_a.h drink_lots_a.c
 $(CC) $(CFLAGS) -c drink_lots_a.c -o drink_lots_a.o

drink_lots_b.o: drink_lots_b.h drink_lots_b.c
 $(CC) $(CFLAGS) -c drink_lots_b.c -o drink_lots_b.o

error.o: error.h error.c
 $(CC) $(CFLAGS) -c error.c -o error.o

clean:
 rm -rf sample516 $(OBJ)

入出力結果(Terminal)

$ make
cc -g -Wall -c sample516.c -o sample516.o
cc -g -Wall -c drink_lots_a.c -o drink_lots_a.o
cc -g -Wall -c drink_lots_b.c -o drink_lots_b.o
cc -g -Wall sample516.o drink_lots_a.o drink_lots_b.o error.o -o sample516
$ ./sample516
バージョンA
壁にはビールが2000000本
2000000本のビール
beers_a = 1900000
beers_a = 1800000
beers_a = 1700000
beers_a = 1600000
beers_a = 1500000
beers_a = 1400000
beers_a = 1300000
beers_a = 1200000
beers_a = 1100000
beers_a = 1000000
beers_a = 900000
beers_a = 800000
beers_a = 700000
beers_a = 600000
beers_a = 500000
beers_a = 400000
beers_a = 300000
beers_a = 200000
beers_a = 100000
beers_a = 0
現在、壁にはビールが0本あります。
バージョンB
壁にはビールが2000000本
2000000本のビール
beers_b = 2073
beers_b = 87
beers_b = 66
beers_b = 59
beers_b = 44
beers_b = 43
beers_b = 33
beers_b = 26
beers_b = 21
beers_b = 15
beers_b = 14
beers_b = 13
beers_b = 10
beers_b = 6
beers_b = 5
beers_b = 4
beers_b = 3
beers_b = 2
beers_b = 1
beers_b = 0
現在、壁にはビールが0本あります。
$ 

0 コメント:

コメントを投稿