Нужно синхронизировать два потока, пока один не запросит данные, другой их не отдает и ждет запроса на данные.
#include <thread>
#include <chrono>
#include <iostream>
#include <vector>
#include <cstdint>
#include <random>
#include <stdexcept>
#include <future>
int main() {
std::random_device rd;
std::mt19937 gen(rd()); //Standard mersenne_twister_engine seeded with rd()
std::uniform_int_distribution<> pause_queue(100, 2800); //если дельта в двух местах превысит 1с
std::atomic_size_t count(100);
using Ready = std::promise<void>;
Ready ready;
using Data = std::vector<std::uint8_t>;
Data val(10, 0);
using Request = std::promise<Data&>;
Request rqst;
std::thread t1([&](){
while(--count) {
auto ftr = ready.get_future();
auto s = ftr.wait_for(std::chrono::seconds(1));
if (std::future_status::ready != s) {
std::cout << "t1 timeot!" << std::endl;
ready = Ready();
continue;
}
std::cout << "OK" << std::endl;
ready = Ready();
rqst.set_value(val);
const auto pause = pause_queue(gen);
std::cout << "t1 pause: " << pause << std::endl;
std::this_thread::sleep_for(std::chrono::milliseconds(pause));
}
});
std::thread t2([&](){
for(;count != 0;) {
const auto pause = pause_queue(gen);
std::cout << "t2 pause: " << pause << std::endl;
std::this_thread::sleep_for(std::chrono::milliseconds(pause));
ready.set_value();
auto ftr = rqst.get_future();
if(ftr.wait_for(std::chrono::seconds(1)) != std::future_status::ready) {
std::cout <<"t2 timeout" << std::endl;
rqst = Request();
continue;
}
auto& rslt = ftr.get();
std::cout<< "t2 recive " << rslt.size() << std::endl;
rqst = Request();
}
});
t1.join();
t2.join();
return 0;
}
Падает на пересоздании Ready-промиса в деструкторе - не устраивает, что промис имеет результат.
Нельзя два раза устанавливать значение, так что при тайм-ауте терпи, ничего не делай. Попробуй такой подход:
// g++ --std=c++11 -pthread prom.cpp
#include <thread>
#include <chrono>
#include <iostream>
#include <vector>
#include <cstdint>
#include <random>
#include <stdexcept>
#include <future>
int main() {
std::random_device rd;
std::mt19937 gen(rd()); //Standard mersenne_twister_engine seeded with rd()
std::uniform_int_distribution<> pause_queue(100, 2800); //если дельта в двух местах превысит 1с
std::atomic_size_t count(50);
using Ready = std::promise<void>;
Ready ready;
using Data = std::vector<std::uint8_t>;
Data val(10, 0);
using Request = std::promise<Data&>;
Request rqst;
std::thread t1([&](){
while(--count) {
std::cout<<"t1:count="<<count<<std::endl;
auto ftr = ready.get_future();
Again:
auto s = ftr.wait_for(std::chrono::seconds(1));
if (std::future_status::ready != s) {
std::cout << "t1 timeot!" << std::endl;
goto Again; }
std::cout << "OK" << std::endl;
ready = Ready();
rqst.set_value(val);
const auto pause = pause_queue(gen);
std::cout << "t1 pause: " << pause << std::endl;
std::this_thread::sleep_for(std::chrono::milliseconds(pause));
}
});
std::thread t2([&](){
for(;count != 0;) {
std::cout<<"t2:count="<<count<<std::endl;
const auto pause = pause_queue(gen);
std::cout << "t2 pause: " << pause << std::endl;
std::this_thread::sleep_for(std::chrono::milliseconds(pause));
ready.set_value();
auto ftr = rqst.get_future();
Again:
if(ftr.wait_for(std::chrono::seconds(1)) != std::future_status::ready) {
std::cout <<"t2 timeout" << std::endl;
if(count==0)break;
goto Again; }
auto& rslt = ftr.get();
std::cout<< "t2 recive " << rslt.size() << std::endl;
rqst = Request();
}
});
t1.join();
t2.join();
return 0;
}
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Допустим, планируется какая-то система классов, например, устройствУ каждого устройства есть некоторые общие члены, например имя устройства,...
Есть метод, который парсит строку вида ширина:долгота@ширина:долгота@
У меня есть список элементов QListWidget в этом списке хранятся QListWidgetItem
Мне нужно записать один обект QJsonObject в другойЯ создал jsonObject и мен нужно в него записать childJsonObject