2018年1月13日土曜日

開発環境

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

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

コード

#include <stdio.h>
#include <CoreWindow.h>

CRITICAL_SECTION cs;

int beers1 = 2000000;
int beers2 = 2000000;


// バージョンA、最初の出力
LPTHREAD_START_ROUTINE drink_lots1(void *a)
{
 EnterCriticalSection(&cs);
 for (size_t i = 0; i < 100000; i++)
 {
  beers1--;
 }
 LeaveCriticalSection(&cs);
 printf("beers1 = %i\n", beers1);
}

// バージョンB、番目の2の出力
LPTHREAD_START_ROUTINE drink_lots2(void *a)
{
 for (size_t i = 0; i < 100000; i++)
 {
  EnterCriticalSection(&cs);
  beers2--;
  LeaveCriticalSection(&cs);
 }
 printf("beers2= %i\n", beers2);
}
int main()
{
 InitializeCriticalSection(&cs);
 HANDLE handls1[20];
 printf("壁にはビールが%i本\n", beers1);
 for (size_t i = 0; i < 20; i++)
 {
  handls1[i] = CreateThread(NULL, 0, drink_lots1, NULL, NULL, NULL);
 }

 for (size_t i = 0; i < 20; i++)
 {
  WaitForSingleObject(handls1[i], INFINITE);
 }
 printf("現在、壁にはビールが%i本あります。\n", beers1);

 HANDLE handls2[20];
 printf("壁にはビールが%i本\n", beers2);
 for (size_t i = 0; i < 20; i++)
 {
  handls1[i] = CreateThread(NULL, 0, drink_lots2, NULL, NULL, NULL);
 }

 for (size_t i = 0; i < 20; i++)
 {
  WaitForSingleObject(handls1[i], INFINITE);
 }
 printf("現在、壁にはビールが%i本あります。\n", beers2);

 DeleteCriticalSection(&cs);
 system("pause");
 return 0;
}

入出力結果(コマンドプロンプト)

壁にはビールが2000000本
beers1 = 1900000
beers1 = 1800000
beers1 = 1700000
beers1 = 1600000
beers1 = 1481124
beers1 = 1400000
beers1 = 1300000
beers1 = 1200000
beers1 = 1100000
beers1 = 1000000
beers1 = 900000
beers1 = 800000
beers1 = 700000
beers1 = 600000
beers1 = 500000
beers1 = 400000
beers1 = 300000
beers1 = 200000
beers1 = 100000
beers1 = 0
現在、壁にはビールが0本あります。
壁にはビールが2000000本
beers2= 1839769
beers2= 1798717
beers2= 1666322
beers2= 1516650
beers2= 1500000
beers2= 1250298
beers2= 1235999
beers2= 1168594
beers2= 1039095
beers2= 996618
beers2= 755573
beers2= 706950
beers2= 495751
beers2= 425391
beers2= 410558
beers2= 310629
beers2= 300000
beers2= 113921
beers2= 9842
beers2= 0
現在、壁にはビールが0本あります。
続行するには何かキーを押してください . . .

0 コメント:

コメントを投稿