#include <mutex>
#include <thread>
#include <iostream>
struct Point
{
public:
void getXY(double& x, double& y) const;
void setXY(double x, double y);
private:
double xcoord;
double ycoord;
mutable std::mutex m;
};
void Point::getXY(double& x, double& y) const
{
std::lock_guard<std::mutex> lg(m);
x = xcoord;
y = ycoord;
}
void Point::setXY(double x, double y)
{
std::lock_guard<std::mutex> lg(m);
xcoord = x;
ycoord = y;
}
void printPoint(const Point &p)
{
double x, y;
p.getXY(x, y);
std::cout << "X: " << x
<< ", Y: " << y << std::endl;
}
void increasePoint(Point &p)
{
double x, y;
p.getXY(x, y);
p.setXY(x * 2, y * 2);
}
int main()
{
Point p;
p.setXY(1.1, -1.1);
std::thread t1(printPoint, std::ref(p));
std::thread t2(increasePoint, std::ref(p));
std::thread t3(increasePoint, std::ref(p));
std::thread t4(printPoint, std::ref(p));
t1.join(); t2.join(); t3.join(); t4.join();
return 0;
}
I2luY2x1ZGUgPG11dGV4PgojaW5jbHVkZSA8dGhyZWFkPgojaW5jbHVkZSA8aW9zdHJlYW0+CgpzdHJ1Y3QgUG9pbnQKewpwdWJsaWM6CiAgdm9pZCBnZXRYWShkb3VibGUmIHgsIGRvdWJsZSYgeSkgY29uc3Q7CiAgdm9pZCBzZXRYWShkb3VibGUgeCwgZG91YmxlIHkpOwpwcml2YXRlOgogIGRvdWJsZSB4Y29vcmQ7CiAgZG91YmxlIHljb29yZDsKICBtdXRhYmxlIHN0ZDo6bXV0ZXggbTsKfTsKCgp2b2lkIFBvaW50OjpnZXRYWShkb3VibGUmIHgsIGRvdWJsZSYgeSkgY29uc3QKewogIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsZyhtKTsKICB4ID0geGNvb3JkOwogIHkgPSB5Y29vcmQ7Cn0KCnZvaWQgUG9pbnQ6OnNldFhZKGRvdWJsZSB4LCBkb3VibGUgeSkKewogIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsZyhtKTsKICB4Y29vcmQgPSB4OwogIHljb29yZCA9IHk7Cn0KCnZvaWQgcHJpbnRQb2ludChjb25zdCBQb2ludCAmcCkKewogIGRvdWJsZSB4LCB5OwogIHAuZ2V0WFkoeCwgeSk7CiAgc3RkOjpjb3V0IDw8ICJYOiAiIDw8IHggCiAgICAgICAgICAgIDw8ICIsIFk6ICIgPDwgeSA8PCBzdGQ6OmVuZGw7Cn0KCnZvaWQgaW5jcmVhc2VQb2ludChQb2ludCAmcCkKewogIGRvdWJsZSB4LCB5OwogIHAuZ2V0WFkoeCwgeSk7CiAgcC5zZXRYWSh4ICogMiwgeSAqIDIpOwp9CgppbnQgbWFpbigpCnsKICBQb2ludCBwOwogIHAuc2V0WFkoMS4xLCAtMS4xKTsKCiAgc3RkOjp0aHJlYWQgdDEocHJpbnRQb2ludCwgc3RkOjpyZWYocCkpOwogIHN0ZDo6dGhyZWFkIHQyKGluY3JlYXNlUG9pbnQsIHN0ZDo6cmVmKHApKTsKICBzdGQ6OnRocmVhZCB0MyhpbmNyZWFzZVBvaW50LCBzdGQ6OnJlZihwKSk7CiAgc3RkOjp0aHJlYWQgdDQocHJpbnRQb2ludCwgc3RkOjpyZWYocCkpOwogCiAgdDEuam9pbigpOyB0Mi5qb2luKCk7IHQzLmpvaW4oKTsgdDQuam9pbigpOwogIHJldHVybiAwOwp9