synchronized
in Java can guarantee thread-safety when accessing a shared object. What about C++?
Java Synchronized Method Synchronized method is used to lock an object for any shared resource. When a thread invokes a synchronized method, it automatically acquires the lock for that object and releases it when the thread completes its task.
Explanation: Vector out of the list is synchronized.
Synchronized keyword in Java is used to provide mutually exclusive access to a shared resource with multiple threads in Java. Synchronization in Java guarantees that no two threads can execute a synchronized method which requires the same lock simultaneously or concurrently.
Use the following in C++:
#include <mutex> std::mutex _mutex; void f() { std::unique_lock<std::mutex> lock(_mutex); // access your resource here. }
Despite this question has been already answered, by the idea of this article I made my version of synchronized
keyword using just standard library (C++11) objects:
#include <mutex> #define synchronized(m) \ for(std::unique_lock<std::recursive_mutex> lk(m); lk; lk.unlock())
You can test it like:
#include <iostream> #include <iomanip> #include <mutex> #include <thread> #include <vector> #define synchronized(m) \ for(std::unique_lock<std::recursive_mutex> lk(m); lk; lk.unlock()) class Test { std::recursive_mutex m_mutex; public: void sayHello(int n) { synchronized(m_mutex) { std::cout << "Hello! My number is: "; std::cout << std::setw(2) << n << std::endl; } } }; int main() { Test test; std::vector<std::thread> threads; std::cout << "Test started..." << std::endl; for(int i = 0; i < 10; ++i) threads.push_back(std::thread([i, &test]() { for(int j = 0; j < 10; ++j) { test.sayHello((i * 10) + j); std::this_thread::sleep_for(std::chrono::milliseconds(100)); } })); for(auto& t : threads) t.join(); std::cout << "Test finished!" << std::endl; return 0; }
This is just an approximation of synchonized
keyword of Java but it works. Without it the sayHello
method of the previous example can be implemented as the accepted answer says:
void sayHello(unsigned int n) { std::unique_lock<std::recursive_mutex> lk(m_mutex); std::cout << "Hello! My number is: "; std::cout << std::setw(2) << n << std::endl; }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With