#include <iostream>
#include <future>
#include <chrono>
using namespace std;
mutex outMutex;
class Test
{
public:
Test(){}
void out(int No, double& q) const
{
{
lock_guard<mutex> tst(outMutex);
cout << "<- " << No << " -- " << &q << endl;
}
this_thread::sleep_for(chrono::seconds(1));
}
void test() const;
};
void Test::test() const
{
double w[2];
cout << "-> " << 0 << " -- " << &w[0] << endl;
future<void> f1 = async( &Test::out,this,0,ref(w[0]));
{
lock_guard<mutex> tst(outMutex);
cout << "-> " << 1 << " -- " << &w[1] << endl;
}
future<void> f2 = async( &Test::out,this,1,ref(w[1]));
f1.get();
f2.get();
}
int main(int argc, const char * argv[])
{
try {
Test t;
t.test();
}
catch(exception&e)
{
cout << "\n" << e.what() << endl;
}
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8ZnV0dXJlPgojaW5jbHVkZSA8Y2hyb25vPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwptdXRleCBvdXRNdXRleDsKY2xhc3MgVGVzdAp7CnB1YmxpYzoKICAgIFRlc3QoKXt9CiAgICB2b2lkIG91dChpbnQgTm8sIGRvdWJsZSYgcSkgY29uc3QKICAgIHsKICAgICAgICB7CiAgICAgICAgICAgIGxvY2tfZ3VhcmQ8bXV0ZXg+IHRzdChvdXRNdXRleCk7CiAgICAgICAgICAgIGNvdXQgPDwgIjwtICIgPDwgTm8gPDwgIiAtLSAiIDw8ICZxIDw8IGVuZGw7CiAgICAgICAgfQogICAgICAgIHRoaXNfdGhyZWFkOjpzbGVlcF9mb3IoY2hyb25vOjpzZWNvbmRzKDEpKTsKICAgIH0KICAgIHZvaWQgdGVzdCgpIGNvbnN0Owp9Owp2b2lkIFRlc3Q6OnRlc3QoKSBjb25zdAp7CiAgICBkb3VibGUgd1syXTsKICAgIGNvdXQgPDwgIi0+ICIgPDwgMCA8PCAiIC0tICIgPDwgJndbMF0gPDwgZW5kbDsKICAgIGZ1dHVyZTx2b2lkPiBmMSA9IGFzeW5jKCAmVGVzdDo6b3V0LHRoaXMsMCxyZWYod1swXSkpOwogICAgewogICAgICAgIGxvY2tfZ3VhcmQ8bXV0ZXg+IHRzdChvdXRNdXRleCk7CiAgICAgICAgY291dCA8PCAiLT4gIiA8PCAxIDw8ICIgLS0gIiA8PCAmd1sxXSA8PCBlbmRsOwogICAgfQogICAgZnV0dXJlPHZvaWQ+IGYyID0gYXN5bmMoICZUZXN0OjpvdXQsdGhpcywxLHJlZih3WzFdKSk7CiAgICBmMS5nZXQoKTsKICAgIGYyLmdldCgpOwp9CmludCBtYWluKGludCBhcmdjLCBjb25zdCBjaGFyICogYXJndltdKQp7CiAgICB0cnkgewogICAgICAgIFRlc3QgdDsKICAgICAgICB0LnRlc3QoKTsKICAgIH0KICAgIGNhdGNoKGV4Y2VwdGlvbiZlKQogICAgewogICAgICAgIGNvdXQgPDwgIlxuIiA8PCBlLndoYXQoKSA8PCBlbmRsOwogICAgfQp9