Создание потоков и их синхронизация в режиме пользователя

Не выводит результат. Задание такое: Разработать программу, которая создает два или более потока управления (системный вызов 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;
}
→ Ссылка