Создание потоков и их синхронизация в режиме пользователя
Не выводит результат. Задание такое: Разработать программу, которая создает два или более потока управления (системный вызов CreateThread), получающих доступ к общим ресурсам по принципу взаимоисключающий доступ. Для синхронизации применять системные структуры CRITICAL_SECTION. (Очередь на основе массива текстовой информации фиксированного размера. Потоки первого вида добавляют информацию, потоки второго вида удаляют информацию.)
Помогите исправить код, выводит первые 2 числа, потом ошибку и все.
#include <iostream>
#include <string>
#include <windows.h>
#include <process.h>
#include <conio.h>
using namespace std;
CRITICAL_SECTION critsect;
HANDLE Fill, Clear, Output;
struct Queue {
private:
int lenght;
int* array;
int start;
int finish;
public:
Queue(int lenght)
{
this->lenght = lenght;
start = 0;
finish = 0;
array = new int[this->lenght];
}
void Push(int val)
{
if (finish != lenght)
{
array[finish] = val;
finish++;
}
}
void Pop()
{
start++;
}
int Top()
{
return array[start];
}
int GetLenght()
{
return finish-start;
}
void Clear()
{
delete[] array;
start = finish = 0;
}
};
void ClearQueue(void* params) {
Queue* queue = (Queue*)params;
cout << "Clear queue" << endl;
EnterCriticalSection(&critsect);
queue->Clear();
Sleep(1000);
LeaveCriticalSection(&critsect);
_endthread();
}
void OutputQueue(void* params)
{
Queue* queue = (Queue*)params;
cout << "Output queue" << endl;
EnterCriticalSection(&critsect);
int lenght = queue->GetLenght();
for (int i = 0; i < lenght; i++);
{
cout << queue->Top() << endl;
queue->Pop();
}
Sleep(1000);
LeaveCriticalSection(&critsect);
_endthread();
}
void FillQueue(void* params)
{
Queue* queue = ((Queue**)params)[0];
int* numbers = ((int**)params)[1];
int lenght = *((int**)params)[2];
cout << "Fill queue" << endl;
EnterCriticalSection(&critsect);
for (int i = 0; i < lenght; i++)
queue->Push(numbers[i]);
Sleep(1000);
LeaveCriticalSection(&critsect);
_endthread();
}
int main()
{
InitializeCriticalSection(&critsect);
Queue* queue = new Queue(30);
int lenght = 10;
int* numbers = new int[lenght];
for (int i = 0; i < lenght; i++)
numbers[i] = i + 1;
void** params = new void*[3];
params[0] = queue;
params[1] = numbers;
params[2] = &lenght;
// =============== может тут чет не так, ПОСЛЕДОВАТЕЛЬНОСТЬ ? ================
Clear = (HANDLE)_beginthread(ClearQueue, 1024, queue);
Output = (HANDLE)_beginthread(OutputQueue, 1024, queue);
Fill = (HANDLE)_beginthread(FillQueue, 1024, params);
Output = (HANDLE)_beginthread(OutputQueue, 1024, queue);
//Clear = (HANDLE)_beginthread(ClearQueue, 1024, queue);
Output = (HANDLE)_beginthread(OutputQueue, 1024, queue);
Sleep(10000);
//DeleteCriticalSection(&critsect);
system("pause");
}
Ответы (1 шт):
Автор решения: Виктор
→ Ссылка
Вот тут точно ошибка:
void Clear()
{
delete[] array;
start = finish = 0;
}
нет создания нового array:
void Clear()
{
start = finish = 0;
delete[] array;
array = new int[this->lenght];
}
а вообще, зачем удалять array?
void Clear()
{
start = finish = 0;
}