Задача о каннибалах. Когда дикарь хочет обедать, он ест из горшка 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;
}
Ну так вы же передаете 0, т.е. null-указатель в качестве параметра потока
hThread[j] = CreateThread(NULL, 0, &Povar, 0, 0, &dwThreadId[j]);
^
А потом получаете этот null-указатель в функции потока и пытаетесь через него что-то читать. Разумеется, все падает.
Что вы пытаетесь сделать этим своим
num = *((int *)arg);
? И почему вы пытаетесь читать через нулевой указатель?
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости