開発環境
- OS: Windows 10 Pro
- IDE(統合開発環境): Visual Studio 2017 (、Clang/C2(試験的))
- プログラミング言語: C(Visual C)
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 コメント:
コメントを投稿