生産者と消費者の問題をシミュレートするプログラムを作成しましたが、いくつかの問題が発生しています。これは、Win32 API を使用して作成されました。
アイテムが格納されているバッファのカウントを実行するために、満杯と空の 2 つのセマフォを使用しています。クリティカル セクションへのアクセスを制御するミューテックスもあります。2 つの関数があります。1 つは単純な計算 (スレッド * 1000000 + カウント) に基づいてアイテムを作成し、もう 1 つはそれを消費します。
バッファーには 10 個のスペースがありますが、プログラムはさまざまな数のスペースとスレッドに対して機能するはずです。Producer スレッドはバッファを通過し、セマフォが 10 までカウントされるまで最初からやり直します。2 つの問題が発生しており、解決策が見つからないようで、デバッガーで多くの詳細を取得することもできません。
1) printf() 関数を持つコメント部分は、毎回スレッドをクラッシュさせます。コンソールに何も出力されません。他の変数を出力せずに、文字列だけを使用してみました。失敗。マルチスレッド環境で printf() を使用すると問題が発生する可能性があるというドキュメントを見つけましたが、この場合はクリティカル セクション内にあり、最初の試行でクラッシュします。その情報をコンソールに出力するにはどうすればよいですか?
2) print ステートメントを削除してコードを実行すると、スレッドは毎回異なる時点でクラッシュします。理由がわかりません。プロデューサー スレッドは、空のセマフォとミューテックスを待機し、項目を入れてから、完全なセマフォのカウントを増やします (項目が追加されたことを示します)。10 に達したら停止する必要があります。コンシューマ スレッドは、完全なセマフォとミューテックスを待機し、アイテムを削除してから、空のセマフォのカウントを増やします。これらのスレッドの終了を引き起こしている、私が書いた方法に何かがありますか?
これは私が得るものです:
プログラム '[5348] OperatingSystem.exe' はコード 0 (0x0) で終了しました。
#include<stdio.h>
#include<windows.h>
#include<ctype.h>
#include<tchar.h>
#include<strsafe.h>
#include<conio.h>
#include<time.h>
#define threads 1
#define MAX 10
typedef struct objects {
HANDLE empty;
HANDLE full;
HANDLE mutex;
int buffer[10];
};
struct objects data;
DWORD WINAPI Producers(LPVOID lpParam){
int count = 0;
int item;
while (TRUE){
if (data.buffer[count] == 0){
WaitForSingleObject(data.empty, INFINITE);
WaitForSingleObject(data.mutex, INFINITE);
item = threads * 1000000 + count;
data.buffer[count] = item;
//printf("Producer has produced: %d", item);
ReleaseMutex(data.mutex);
ReleaseSemaphore(data.full, 1, NULL);
}
count++;
if (count == 10){ count = 0; }
};
}
DWORD WINAPI Consumers(LPVOID lpParam){
int count = 0;
while (TRUE){
if (data.buffer[count] != 0){
WaitForSingleObject(data.full, INFINITE);
WaitForSingleObject(data.mutex, INFINITE);
//printf("Consumer has consummed: %d", data.buffer[count]);
data.buffer[count] = 0;
ReleaseMutex(data.mutex);
ReleaseSemaphore(data.empty, 1, NULL);
}
count++;
if (count == 10){ count = 0; }
};
}
int main(int argc, char *argv[]) {
struct objects data;
LONG initialCount = 0;
LONG maxCount = 10;
data.empty = CreateSemaphore(NULL, maxCount, maxCount, NULL);
data.full = CreateSemaphore(NULL, initialCount, maxCount, NULL);
data.mutex = CreateMutex(NULL, FALSE, NULL);
DWORD ConsumerId[threads];
HANDLE ConsumerThread[threads];
DWORD ProducerId[threads];
HANDLE ProducerThread[threads];
for (int i = 0; i < threads; i++){
ProducerThread[i] = CreateThread(
NULL,
0,
Producers,
NULL,
0,
&ProducerId[i]);
ConsumerThread[i] = CreateThread(
NULL,
0,
Consumers,
NULL,
0,
&ConsumerId[i]);
}
}