본문 바로가기

Language/C++14

[C++] std::unique_lock, std::scope_lock, std::shared_lock 1. std::unique_lock// std::unique_lock의 생성자std::mutex m;std::timed_mutex tm;using namespace std::literals;std::unique_lock u1; // 연결된 mutex 없이 unique_lock 객체만 생성std::unique_lock u2(m); // 생성자에서 m.lock()을 수행std::unique_lock u3(m, std::try_to_lock); // 생성자에서 m.try_lock()을 수행std::unique_lock u4(m, std::adopt_lock); // 이미 lock를 획득한 뮤텍스로 초기화std::unique_lock u5(m, std::defer_lock); // unique_lock을 먼.. 2025. 7. 9.
[C++] std::shared_mutex 위 그림처럼 하나의 쓰레드가 읽는 동안 다른 쓰레드도 읽어야 할 경우 shared_mutex를 사용한다. 1. std::shared_mutex를 사용하지 않은 경우#include #include #include #include #include #include using namespace std::literals;std::mutex m;int shared_data = 0;void Writer() { while(1) { m.lock(); shared_data += 1; std::cout 위 코드의 결과는 Writer : 1Reader(A) : 1Reader(B) : 1Reader(C) : 1Writer : 2Reader(A) : 2Reader(B) : 2Reade.. 2025. 7. 8.
[C++] std::timed_mutex, std::recursive_mutex std::timed_mutex일반적인 std::mutex와 사용성은 완전 동일하지만, 맴버 함수의 차이가 있다. std::mutexstd::timed_mutexlockOOtry_lockOOunlockOOnative_handle(OS단의 핸들을 얻는 함수)OOtry_lock_forXOtry_lock_untilXO std::recursive_mutex하나의 스레드가 "여러번 뮤텍스 소유" 가능.소유한 횟수 만큼 unlock() 해야한다.어떤 경우에 사용할까?// std::recursive_mutex 사용 예시class rMutex {private: int shared_data = 0; std::recursive_mutex m; public: void f1() { m.lock();.. 2025. 2. 3.
[C++] std::jthread std::thread 사용시 - 반드시 join 또는 detach 해야한다. std::jthread - C++20 에서 추가된 새로운 스레드 클래스 -  - 소멸자에서 join을 해준다.#include #inlcude #include using namespace std::literals;void foo(int a, double b) { std::cout  jthread에서 stop token 예제#include #include #include using namespace std::literals;void foo() { for (int i = 0 ; i 2025. 1. 6.
[C++] std::async std::async- 주어진 함수를 비동기 (asynchronous)로 수행하는 함수 템플릿- 기존에 작성된 함수를 간단하게 스레드로 수행할 수 있다.- 일반적인 구현은 스레드 풀 사용- std::future 반환 1. std::async 기본 예제#include #include #include #include using namespace std::literals;int add(int a, int b) { std::this_thread::sleep_for(2s); return a+b;}int main() { std::future ft = std::async(add, 10, 20); std::cout - 위 예제에서 ft.get()을 호출하지 않아도 future의 소멸자에서 get()을 호출하여.. 2024. 12. 20.
[C++] std::packaged_task 멀티쓰레드를 고려하지 않은 일반 함수에 대해서 값을 꺼내오고 싶을때 사용std::packaged_task 예제#include #include #include int add(int a, int b){ std::cout task(add); std::future ft = task.get_future(); std::thread t(std::move(task), 10, 20); int ret = ft.get(); std::cout 2024. 12. 18.