[C++]以下の問題をマルチスレッドで解くために,コードを書いてみましたがうまくいきません. エラーは出ませんが,肝心の出力変数sum_sakuraとsum_tomoyoが0のままファイルに書き込まれます.
マルチスレッドはどのように実装すればよいのでしょうか?
sakuraさんとtomoyoさんの初期位置は自宅で、店にはリンゴが100個あります.
リンゴが完売した時点でプログラムは終了です.
最終的にsakuraさんとtomoyoさんはそれぞれ何個のリンゴを購入しましたか?
sakuraさん
・家からの店への片道時間(帰りも同じ) 1秒
・自宅での荷降ろし 3秒
・八百屋での店員とのやり取り 1秒
・一度に購入できるりんごの個数 5個
tomoyoさん
・家からの店への片道時間(帰りも同じ) 2秒
・自宅での荷降ろし 1秒
・八百屋での店員とのやり取り 2秒
・一度に購入できるりんごの個数 3個
店員akira
・客は1人ずつしか対応できない
・店にはりんごが100個ある
C++
1#include "C2_report10.h" 2 3int main() 4{ 5 // カレントディレクトリの取得 6 char s_currentDir[_MAX_PATH]; 7 GetCurrentDirectory(sizeof(s_currentDir), s_currentDir); 8 // ファイルパスの作成(iniファイルから読み込み) 9 char s_inifile[_MAX_PATH]; 10 sprintf_s(s_inifile, "%s\C2_report10.ini", s_currentDir); 11 12 //構造体にiniファイルのデータを格納 13 //sakura 14 struct Customer sakura, tomoyo; 15 sakura.travel_time = GetPrivateProfileInt("sakura","travel_time", -1, s_inifile); 16 sakura.home_time = GetPrivateProfileInt("sakura", "home_time", -1, s_inifile); 17 sakura.exchange_time = GetPrivateProfileInt("sakura", "exchange_time", -1, s_inifile); 18 sakura.having_apple = GetPrivateProfileInt("sakura", "having_apple", -1, s_inifile); 19 //tomoyo 20 tomoyo.travel_time = GetPrivateProfileInt("tomoyo", "travel_time", -1, s_inifile); 21 tomoyo.home_time = GetPrivateProfileInt("tomoyo", "home_time", -1, s_inifile); 22 tomoyo.exchange_time = GetPrivateProfileInt("tomoyo", "exchange_time", -1, s_inifile); 23 tomoyo.having_apple = GetPrivateProfileInt("tomoyo", "having_apple", -1, s_inifile); 24 //akira 25 struct Shop akito; 26 akito.all_apple = GetPrivateProfileInt("akito", "all_apple", -1, s_inifile); 27 28 //sakuraとtomoyoのそれぞれのりんご所持限界 29 sakura_max = 5; 30 tomoyo_max = 3; 31 32 //sakuraとtomoyoの接客時間設定 33 sakura_exchanging = sakura.exchange_time; 34 tomoyo_exchanging = tomoyo.exchange_time; 35 36 //turn_time設定 37 sakura_turn_time = sakura.travel_time * 2 + sakura.home_time; 38 tomoyo_turn_time = tomoyo.travel_time * 2 + tomoyo.home_time; 39 40 //マルチスレッドスタート↓ 41 //next_time変数を自宅から店までの片道時間に初期化 42 float sakura_next_time = sakura.travel_time; //sakuraが次にりんごを買いに来るまでの時間 43 float tomoyo_next_time = tomoyo.travel_time; //tomoyoが次にりんごを買いに来るまでの時間 44 45 std::thread th1(ThreadProcess1); 46 std::thread th2(ThreadProcess2); 47 48 th1.join(); 49 th2.join(); 50 //マルチスレッド終了↑ 51 52 //ファイルオープン 53 FILE* fp; 54 errno_t error = fopen_s(&fp, "result.txt", "w"); 55 if (error != 0) return false; 56 57 //ファイル書き込み 58 char s_buf[BUFFSIZE]; 59 sprintf_s(s_buf, "sakura=%d, tomoyo=%d", sum_sakura, sum_tomoyo); 60 fputs(s_buf, fp); 61 62 //ファイルクローズ 63 fclose(fp); 64 65} 66 67//sakuraスレッド 68void ThreadProcess1() { 69 70 while (sum_apple <= 0) 71 { 72 //tomoyoを接客中なので何もしないで待つ 73 if (waiting == 1) 74 { 75 sakura_next_time--; 76 } 77 else //店員の手が空いてるとき 78 { 79 waiting = 1; 80 for (int i = 0; i < sakura_exchanging; i++) 81 { 82 if (sakura_next_time <= 0) 83 { 84 for (int j = 0; j < sakura_max; j++) 85 { 86 sum_sakura++; 87 sum_akira--; 88 if (sum_akira <= 0) break; 89 } 90 91 //next_timeリセット 92 sakura_next_time = sakura_turn_time; 93 } 94 } 95 waiting = 0; 96 } 97 if (sum_akira <= 0) break; 98 } 99 100 101} 102 103//tomoyoスレッド 104void ThreadProcess2() { 105 while (sum_apple <= 0) 106 { 107 //sakuraを接客中なので何もしないで待つ 108 if (waiting == 1) 109 { 110 tomoyo_next_time--; 111 } 112 else //店員の手が空いてるとき 113 { 114 waiting = 1; 115 for (int i = 0; i < tomoyo_exchanging; i++) 116 { 117 if (tomoyo_next_time <= 0) 118 { 119 for (int j = 0; j < sakura_max; j++) 120 { 121 sum_tomoyo++; 122 sum_akira--; 123 if (sum_akira <= 0) break; 124 } 125 126 //next_timeリセット 127 tomoyo_next_time = tomoyo_turn_time; 128 } 129 } 130 waiting = 0; 131 } 132 if (sum_akira <= 0) break; 133 } 134 135}
ちなみにヘッダーファイルは以下の通りです.
使ってないライブラリもあります.
C++
1#pragma once 2 3#pragma comment(lib, "winmm.lib") 4 5//インクルードライブラリ 6#include <windows.h> 7#include <mmsystem.h> 8#include <stdio.h> 9#include <stdlib.h> 10#include <time.h> 11#include <vector> 12#include <process.h> 13#include <thread> 14 15//マクロ宣言 16#define BUFFSIZE 1024 17 18//構造体宣言(客さくら,ともよ) 19typedef struct Customer { 20 int travel_time; //家から八百屋への片道時間 21 int home_time; //自宅での荷降ろし時間 22 int exchange_time; //八百屋での店員とのやり取り時間 23 int having_apple; //一度に購入できるりんごの数 24}; 25 26//構造体宣言(八百屋あきら) 27typedef struct Shop { 28 int all_apple; //販売りんご総数 29}; 30 31//グローバル変数宣言 32float sum_apple = 100; //残りりんご個数 33float waiting = 0; //店員の接客パラメータ(0で非接客中, 1で接客中) 34float sakura_next_time = 0; //sakuraが次にりんごを買いに来るまでの時間 35float tomoyo_next_time = 0; //tomoyoが次にりんごを買いに来るまでの時間 36float sakura_turn_time = 0; //sakuraの往復時間 37float tomoyo_turn_time = 0; //tomoyoがの往復時間 38float sakura_max = 0; //sakuraのりんご所持数限界 39float tomoyo_max = 0; //tomoyoのりんご所持数限界 40float sakura_exchanging = 0; //sakuraのやり取り時間 41float tomoyo_exchanging = 0; //tomoyoのやり取り時間 42float sum_sakura = 0; //sakuraのりんご現在所持数 43float sum_tomoyo = 0; //tomoyoのりんご現在所持数 44float sum_akira = 0; //akiraのりんご現在所持数 45 46//関数のプリ宣言 47void ThreadProcess1(); 48void ThreadProcess2();
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。