/////////////////////////////////////////////////////////////////////// // MT4Q5.cpp - Thread safe sharing // // // // Jim Fawcett, CSE687 - Object Oriented Design Midterm, Spring 2018 // /////////////////////////////////////////////////////////////////////// #include #include #include #include #include //----< concurrent sharing happens here >------------------------------ void modifyString(const std::string& name, std::string& shared) { static std::mutex mtx; std::unique_lock lck(mtx, std::defer_lock); for (size_t i = 0; i < 5; ++i) { lck.lock(); shared += name; lck.unlock(); std::this_thread::sleep_for(std::chrono::milliseconds(20)); } } //----< protect shared string from outside access >-------------------- std::string makeCopyOfSharedString(std::string shared) { std::thread t1(modifyString, "Gabe ", std::ref(shared)); std::thread t2(modifyString, "Ankur ", std::ref(shared)); std::thread t3(modifyString, "Tianyu ", std::ref(shared)); // client can't use shared string until threads are done // so we might as well join, but even so, sharing is // a parallel execution t1.join(); t2.join(); t3.join(); return shared; } int main() { std::cout << "\n MT4Q5 - thread safe sharing"; std::cout << "\n ============================="; std::string shared; std::cout << "\n " << makeCopyOfSharedString(shared) << "\n\n"; return 0; }