Почему не работают мои темы?

// windows_procon.cpp : Defines the entry point for the console application.

#include "stdafx.h"#include <stdlib.h>
#include <iostream>
#include <time.h>
#include <windows.h>
#include <process.h>
using namespace std;

HANDLE mutex;
HANDLE emptySlots;
HANDLE filledSlots;

#define BUFFER_SIZE 10

void *producer(void *);
void *consumer(void *);
int produceItem(void);
void printBuffer(void);

int buffer[BUFFER_SIZE];
int head = 0;
int tail = 0;

int _tmain(int argc, _TCHAR* argv[])
{
DWORD prodThrdID, consThrdID;

mutex = CreateMutex(NULL,FALSE,NULL);
emptySlots = CreateSemaphore(NULL,BUFFER_SIZE,BUFFER_SIZE,NULL);
filledSlots = CreateSemaphore(NULL,0,0,NULL);

srand(time(NULL));

_beginthreadex(NULL, 0, (unsigned int(__stdcall *)(void*))producer,
0, 0, (unsigned int *)&prodThrdID);
_beginthreadex(NULL, 0, (unsigned int(__stdcall *)(void*))consumer,
0, 0, (unsigned int *)&consThrdID);

return 0;
}

void *producer(void *n)
{
int item;
for(int i = 0; i <BUFFER_SIZE+5; i++)
{
WaitForSingleObject(emptySlots,INFINITE);
WaitForSingleObject(mutex,INFINITE);

item = produceItem();
//printf("Producing");

cout << "Producing: " << item << endl;
//logfile << "Producing: "<< item << endl;
//fprintf(logfile, "Producing: %d \n", item);
buffer[head] = item;
head = (head + 1) % BUFFER_SIZE;
printBuffer();

ReleaseMutex(mutex);
ReleaseSemaphore(filledSlots,1, NULL);
}
return n;
}

void *consumer(void *n)
{
for(int i = 0; i <BUFFER_SIZE+5; i++)
{
WaitForSingleObject(filledSlots,INFINITE);
//Sleep(500);
WaitForSingleObject(mutex,INFINITE);

cout << "Consuming: " << buffer[tail] << endl;

buffer[tail] = 0;
tail = (tail + 1) % BUFFER_SIZE;
printBuffer();

ReleaseMutex(mutex);
ReleaseSemaphore(emptySlots,1, NULL);
}
return n;
}

int produceItem(void)
{
int x = (rand()%11 + 1);
return x;
}

void printBuffer(void)
{
for(int i = 0; i <BUFFER_SIZE; i++)
{
printf("%d ", buffer[i]);
}
printf("END \n");
}

Моя программа здесь должна быть алгоритмом для задачи «производитель-потребитель». Я думаю, что у меня правильный алгоритм, единственная проблема в том, что у меня возникают проблемы с правильной работой потоков. Может кто-нибудь сказать мне, в чем проблема?

0

Решение

Вам нужно подождать, пока потоки, созданные с помощью _beginthreadex, выполнят свою работу, так как ваша программа завершит работу сразу после их создания. Я больше не смотрю на твою логику.

Вот пример.

hThread = (HANDLE)_beginthreadex( NULL, 0, &SecondThreadFunc, NULL, 0, &threadID );
WaitForSingleObject( hThread, INFINITE );
1

Другие решения

Других решений пока нет …