08_event

08_event

날짜
생성자
ShalomShalom
카테고리
pararell
작성일
2023년 05월 15일
태그
c++
이전 블로그
lock이 해제됨을 이벤트로 발생시켜서 새로운 lock 될 수 있도록 한다.

코드

#include "pch.h" #include <iostream> #include "CorePch.h" #include <thread> #include <atomic> #include <mutex> mutex m; queue<i32> q; void Producer() { while (true) { { unique_lock<mutex> lock(m); q.push(100); } this_thread::sleep_for(200m); } } void Consumer() { while (true) { unique_lock<mutex> lock(m); // 해당 부분이 계속 스핀락 if (q.empty() == false) { i32 data = q.front(); q.pop(); cout << data << endl; } } } int main() { thread t1(Producer); thread t2(Consumer); t1.join(); t2.join(); }
위와 같은 상황이라면 계속 해당 부분이 스핀락이 걸리면서 cpu를 점유하고 있을 것이다.

해결

#include "pch.h" #include <iostream> #include "CorePch.h" #include <thread> #include <atomic> #include <mutex> #include <Windows.h> mutex m; queue<i32> q; HANDLE event; void Producer() { while (true) { { unique_lock<mutex> lock(m); q.push(100); } ::SetEvent(event); this_thread::sleep_for(100ms); } } void Consumer() { while (true) { ::WaitForSingleObject(event, INFINITE); unique_lock<mutex> lock(m); if (q.empty() == false) { i32 data = q.front(); q.pop(); cout << data << endl; } } } int main() { // 커널 오브젝트 // Usafe Count // Signal, Non-Signal // Auto, Manual event = ::CreateEvent(NULL/*보안 속성*/, FALSE /*자동으로 Event 변수를 초기화 시켜줄지*/, FALSE /*이벤트 초기값*/, NULL /*이름*/); thread t1(Producer); thread t2(Consumer); t1.join(); t2.join(); CloseHandle(event); }
 

댓글

guest