Подскажите, как исправить ошибку

199
03 мая 2019, 03:20

Задача о каннибалах. Когда дикарь хочет обедать, он ест из горшка 1 кусок, если только горшок не пуст, иначе дикарь будит повара и ждет, пока тот не наполнит горшок. Повар, сварив обед, засыпает. Создать многопоточное приложение, моделирующее обед дикарей. При решении задачи пользоваться семафорами. На экран нужно выводить состояние каждого из n дикарей (ест или ждет), состояние повара (спит или готовит). сообщение о наполненности горшка (полон или пуст).

#include <iostream>
#include <stdio.h>
#include <windows.h>
#include <process.h>
#include <stdlib.h>
#include <Tchar.h>
int n = 5; // количество кусков - норма
const int m = 1, // количество производителей 
k = 10;  // количество потребителей
HANDLE hMutex;

DWORD WINAPI Povar(void * arg) {
int num = 0;
num = *((int *)arg);
while (1) {
    WaitForSingleObject(hMutex, INFINITE);
    printf(" I'm Povar :)  ");
    if (n == 0)
    {
        printf(" Povar cooking \n");
        n = 5;
        printf("povar sdelal %d kuskov meat\n", n);
    }
    printf(" now gorshok have some meat, that i can go to sleep \n");
    Sleep(1000);
    ReleaseMutex(hMutex);
    Sleep(1000);
}
return 0;
};

DWORD WINAPI Kanibal(void * arg)
{
int num = 0;
num = *((int *)arg);
while (1) {
    WaitForSingleObject(hMutex, INFINITE);
    printf(" Kanibal  %d very want to eat!!!!! :) \n", num);
    if (n == 0)
    {
        printf(" kanibal ne kushaet, gorshok is empty \n ");
        Sleep(1000);
    }
    else
    {
        printf(" kanibal nomer %d kushaet  kusok myasa = %d\n", num, n);
        n--;
        return 0;
    }
    ReleaseMutex(hMutex);
    Sleep(1000);
}
return 0;
};

int main(int argc, char* argv)
{
DWORD dwThreadId[k + m];
HANDLE hThread[k + m];
hMutex = CreateMutex(NULL, FALSE, _T("MyMutex"));

for (int j = 0; j < m; j++)
{
    hThread[j] = CreateThread(NULL, 0, &Povar, 0, 0, &dwThreadId[j]);
}

for (int i = m; i < k + m; i++)
{
    hThread[i] = CreateThread(NULL, 0, &Kanibal, 0, 0, &dwThreadId[i]);
}
WaitForMultipleObjects(11, hThread, TRUE, INFINITE);
return 0;
}

Answer 1

Ну так вы же передаете 0, т.е. null-указатель в качестве параметра потока

hThread[j] = CreateThread(NULL, 0, &Povar, 0, 0, &dwThreadId[j]);
                                           ^

А потом получаете этот null-указатель в функции потока и пытаетесь через него что-то читать. Разумеется, все падает.

Что вы пытаетесь сделать этим своим

num = *((int *)arg);

? И почему вы пытаетесь читать через нулевой указатель?