-
Notifications
You must be signed in to change notification settings - Fork 0
/
TakeprofitProg.cpp
71 lines (65 loc) · 4.01 KB
/
TakeprofitProg.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
/* Эта программа является тестовым заданием
* Необходимо подключиться к серверу и направить на сервер 2018 целых чисел,
* в ответ на каждое число сервер будет присылать ответ, числа в диапазоне 0 <= x <= 1e7).
* Итог задачи: необходимо направить медиану полученных чисел на сервер и получить сообщение о
* правильности ответа.
* Дополнительные условия задачи:
* - программа должна быть многопоточной;
* - сервер может обрывать соединения
* - сервер может присылать мусор до числа-ответа и после
*
* Для реализации программы я определил следующие объекты
* - Storage, это объект, который хранит все полученные значения в контейнере vector,
* объект хранится в статическом поле. Основной поток переодически опрашивает storage
* и ждет от него значение медианы или 0. Если 0, то еще получены не все числа.
* - TcpClient, это объект, который осуществляет TCP соединение с сервером. На вход имеет два параметра
* первое - это число для отправки, второе это флаг. Флаг указывает будет клиент отправлять конечный ответ
* или будет ждать числа для решения задачи.
* - ThreadPool, это объект, который создает определенное значение потоков и добавляет их в контейнер
* (максимальное возможное число потоков на этом компьютере деленное на 2, для снижения нагрузки). В объекте
* создана очередь задач на выполнение, которая пополняется из основного потока (2018 цифр для отправки). Каждый
* поток, после инициализации будет пойман condition_varible и будет ожидать условия для выхода (1 условие - наличие
* задачи в очереди, 2 условие - указание на закрытие всех потоков).
*
* Основной поток инициализирует Объект storage и указывает сколько цифр он ожидает, инициализирует threadPool
* далее создает нужное количество задач и переходит в режим переодического опрашивания storage на завершение задачи
*
*/
#pragma once
#include <iostream>
#include <thread>
#include <chrono>
#include <memory>
#include <list>
#include <functional>
#include "TcpClient.h"
#include "Storage.h"
#include "ThreadPool.h"
void getNumber(int numberToCheck)
{
std::unique_ptr<TcpClient> client(new TcpClient(numberToCheck,0));
}
int main()
{
setlocale(LC_ALL, "Russian_Russia.20866");
const int maxNumbers = 2018;
Storage *storage = Storage::getInstance(maxNumbers);
ThreadPool threadPool;
for (int i = 1; i <= maxNumbers; i++)
{
threadPool.addTask(std::bind(&getNumber, i));
}
int number{};
while (true)
{
std::this_thread::sleep_for(std::chrono::milliseconds(100));
if ((number = storage->makeCalculations()))
{
std::unique_ptr<TcpClient> client(new TcpClient(number, 1));
break;
}
}
threadPool.stop();
int a;
std::cin >> a;
}