#include <thread>
#include <future>
#include <chrono>
#include <iostream>
#include <chrono>
using namespace std;
struct SharedStateWhichBlocks {
~SharedStateWhichBlocks()
{
thread t([]() {
this_thread::sleep_for(std::chrono::seconds(5));
});
t.join();
cout << "~SharedStateWhichBlocks" << endl;
}
};
int main()
{
auto start = std::chrono::high_resolution_clock::now();
SharedStateWhichBlocks *state = new SharedStateWhichBlocks();
{
promise<SharedStateWhichBlocks> pr;
future<SharedStateWhichBlocks> fut = pr.get_future();
pr.set_value(*state);
cout << "Will now block since ~SharedStateWhichBlocks will be called" << endl;
}
auto end = std::chrono::high_resolution_clock::now();
auto difference = std::chrono::duration_cast<std::chrono::seconds>(end - start).count();
std::cout << "Seconds for the block { ... } " << difference << endl;
}
I2luY2x1ZGUgPHRocmVhZD4KI2luY2x1ZGUgPGZ1dHVyZT4KI2luY2x1ZGUgPGNocm9ubz4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y2hyb25vPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKc3RydWN0IFNoYXJlZFN0YXRlV2hpY2hCbG9ja3MgewogICAgflNoYXJlZFN0YXRlV2hpY2hCbG9ja3MoKQogICAgewogICAgICAgIHRocmVhZCB0KFtdKCkgewogICAgICAgICAgICB0aGlzX3RocmVhZDo6c2xlZXBfZm9yKHN0ZDo6Y2hyb25vOjpzZWNvbmRzKDUpKTsKICAgICAgICB9KTsKICAgICAgICB0LmpvaW4oKTsKICAgICAgICBjb3V0IDw8ICJ+U2hhcmVkU3RhdGVXaGljaEJsb2NrcyIgPDwgZW5kbDsKICAgIH0KfTsKCmludCBtYWluKCkKewoKCWF1dG8gc3RhcnQgPSBzdGQ6OmNocm9ubzo6aGlnaF9yZXNvbHV0aW9uX2Nsb2NrOjpub3coKTsKICAgIFNoYXJlZFN0YXRlV2hpY2hCbG9ja3MgKnN0YXRlID0gbmV3IFNoYXJlZFN0YXRlV2hpY2hCbG9ja3MoKTsKICAgIHsKICAgICAgICBwcm9taXNlPFNoYXJlZFN0YXRlV2hpY2hCbG9ja3M+IHByOwogICAgICAgIGZ1dHVyZTxTaGFyZWRTdGF0ZVdoaWNoQmxvY2tzPiBmdXQgPSBwci5nZXRfZnV0dXJlKCk7CiAgICAgICAgcHIuc2V0X3ZhbHVlKCpzdGF0ZSk7CiAgICAgICAgY291dCA8PCAiV2lsbCBub3cgYmxvY2sgc2luY2UgflNoYXJlZFN0YXRlV2hpY2hCbG9ja3Mgd2lsbCBiZSBjYWxsZWQiIDw8IGVuZGw7CiAgICB9CiAgICBhdXRvIGVuZCA9IHN0ZDo6Y2hyb25vOjpoaWdoX3Jlc29sdXRpb25fY2xvY2s6Om5vdygpOwogICAgYXV0byBkaWZmZXJlbmNlID0gc3RkOjpjaHJvbm86OmR1cmF0aW9uX2Nhc3Q8c3RkOjpjaHJvbm86OnNlY29uZHM+KGVuZCAtIHN0YXJ0KS5jb3VudCgpOwogICAgc3RkOjpjb3V0IDw8ICJTZWNvbmRzIGZvciB0aGUgYmxvY2sgeyAuLi4gfSAiIDw8IGRpZmZlcmVuY2UgPDwgZW5kbDsKfQ==