반응형
en.cppreference.com/w/cpp/thread/shared_mutex
상호배타적인 다른 mutex들과 달리 shard_mutex는 공유 자원에 대한 두 가지 접근 방법을 제공합니다
- shared - 여러 스레드가 mutex 소유권을 공유하는 방법
- shared lock을 수행하는 경우 (lock_shared, try_lock_shared를 통해서), 다른 스레드는 shared lock을 수행할 수 있습니다. (exclusive lock는 불가능)
- exclusive - 오직 하나의 스레드만 mutex 소유권을 갖는 방법
- exclusive lock을 수행하여 소유권을 갖는 경우 (lock 또는 try_lock을 통해서), 다른 스레드는 lock을 수행할 수 없습니다
cf. 하나의 스레드에서는 한 종류의 lock만 호출할 수 있습니다 (exclusive lock 또는 shared lock).
shared_mutex는 공유 자원을 읽을 때는 소유권을 공유하고, 공유 자원에 값을 쓰는 경우에만 배타적으로 관리하고 싶을 때 유용하게 사용할 수 있습니다. 값을 읽을 때 (shared lock)는 다른 스레드에서 값을 읽더라도 (shared lock) 문제가 없고, 값을 쓸 때 (exclusive lock)는 다른 스레드에서 값을 읽거나 (shared lock) 쓰지 못하도록 (exclusive lock) 하는 경우를 예를 들 수 있습니다.
Member functions
Exclusive locking
- lock
- try_lock
- unlock
Shared locking
- lock_shared
- try_lock_shared
- unlock_shared
Sample code
#include <iostream>
#include <mutex> // For std::unique_lock
#include <shared_mutex>
#include <thread>
class ThreadSafeCounter {
public:
ThreadSafeCounter() = default;
// Multiple threads/readers can read the counter's value at the same time.
unsigned int get() const {
std::shared_lock lock(mutex_);
return value_;
}
// Only one thread/writer can increment/write the counter's value.
void increment() {
std::unique_lock lock(mutex_);
value_++;
}
// Only one thread/writer can reset/write the counter's value.
void reset() {
std::unique_lock lock(mutex_);
value_ = 0;
}
private:
mutable std::shared_mutex mutex_;
unsigned int value_ = 0;
};
int main() {
ThreadSafeCounter counter;
auto increment_and_print = [&counter]() {
for (int i = 0; i < 3; i++) {
counter.increment();
std::cout << std::this_thread::get_id() << ' ' << counter.get() << '\n';
// Note: Writing to std::cout actually needs to be synchronized as well
// by another std::mutex. This has been omitted to keep the example small.
}
};
std::thread thread1(increment_and_print);
std::thread thread2(increment_and_print);
thread1.join();
thread2.join();
}
반응형
'💻 programming > c++' 카테고리의 다른 글
[c++] lvalue reference and rvalue reference (0) | 2021.08.04 |
---|---|
[c++] condition variable (조건 변수) (0) | 2020.12.17 |
[c++] std::timed_mutex (0) | 2020.12.16 |
[c++] std::recursive_mutex (std::mutex 비교) (0) | 2020.12.16 |
[c++] std::mutex (0) | 2020.12.16 |
댓글