вот так выглядит все задание полностью - Основной поток создает два других потока приостановленными и после их создания запускает первый. Первый из них выделяет блок памяти размеров 200Кб, заполняет его случайными числами и запускает второй потом, который записывает сгенерированные случайные числа в файл, освобождает выделенную память и завершается
вот так у меня есть на данный момент
#include "pch.h"
#include <iostream>
#include <windows.h>
#include "conio.h"
#include <vector>
//#include "stdafx.h"
using namespace std;
const int Length =200 * 1024;
unsigned char *buffer = new unsigned char[Length];
int num;
DWORD WINAPI thread2(LPVOID);
DWORD WINAPI thread3(LPVOID);
int main()
{
// create threats
HANDLE thread = CreateThread(NULL, 0, thread2, NULL, 0, NULL);
HANDLE thread1 = CreateThread(NULL, 0, thread3, NULL, 0, NULL);
// stop threads
SuspendThread(thread);
SuspendThread(thread1);
ResumeThread(thread);
_getch();
return 0;
}
DWORD WINAPI thread2(LPVOID t)
{
for (int i = 0; i< Length; i++)
{
buffer[i] = (int)rand() % Length + 1;
}
for (int i = 0; i < Length; i++)
{
cout « (int)buffer[i] « " ";
cout « endl;
}
delete[]buffer;
//cout « "wwwwwwwwwwwwwwwwwwww";
return 0;
}
DWORD WINAPI thread3(LPVOID n )
{
return 0;
}
Хорошо вначале открыть книжку и стать чуточку сильнее.
Вначале я посмотрел на это
byte *buffer = new byte [200*1024];
нормально выделили памяти, 200 килобайт (правда производители дисков скажут, что здесь 204.8 килобайта). Правда тип std::byte доступен только с 17 плюсов, а значит не каждый школьный компилятор его возьмет. Но может тут просто обычный #define byte char
Но потом я увидел это
int *Arr = new int[*buffer];
buffer - это указатель на массив, а *buffer
это *(buffer+0)
, то есть buffer[0]
. То есть, выделяем ещё один массив int, размер которого записан в первом элементе массива. Очень интересно. Дело в том, что сам то buffer[0] ещё не инициализированный, поэтому, код может выделить любое кол-во байт (в определенном диапазоне конечно).
Смотрим дальше
for(int i=-; i< *buffer; i++)
явно переписывалось с какого ксерокса. Выражение int i=-;
не валидное. И скорее всего имелось ввиду int i=0;
.
Но на этом это выражение не завершилось. Смотрим в вторую половину i< *buffer
- пока i меньше значения нулевого элемента (неинициализированного массива). Ой. Это полный ой. Но опустив глаза на следующий цикл, мне кажется, что под *buffer
автор имел ввиду размер массива. Тогда все стает на свои места. Даже эта строка num = rand()% *buffer +1;
обретает смысл. Но оно и подсказывает, что byte это не std::byte. И rand по всей видимости какой то не такой
опустимся вниз. Там нас ждет delet[]Arr;
. явно недописанная буква e. Ок. Правда оно в цикле, но какая теперь разница:) теперь можно написать как надо.
Просто поправленная, но все равно ужасная версия
using namespace std;
const int LEN = 200*1024;
unsigned char *buffer = new unsigned char [LEN];
int num;
for(int i=0; i< LEN; i++)
{
buffer[i] = (int)rand()% LEN +1;
}
for(int i = 0; i< LEN; i++)
{
cout << buffer[i] << " ";
cout << endl;
}
delete[]buffer;
Вывод: Откройте книгу или конспект. Почитайте.
А потоки.. А нет в программе потоков. Но судя по вопросу, ищется что то вида Consumer-producer. Но это немножко более сложный код. Например, где то так.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Почему эта программа не выдаёт ошибок для 1 и 2 строки, но выдаёт их для 3 и 4?
Пишу веб сокет сервер на языке javaЕсть ксласс с обработчиком событий: открытие, закрытие соединения, ошибки, и сообщения