Condition Variable 질문입니다.
184
작성한 질문수 34
//Producer
while(true)
{
{
unique_lock<mutex> lock(m);
q.push(100);
}
cv.notify_one();
}
//Consumer
while(true)
{
unique_lock<mutex> lock(m);
cv.wait(lock,[](){return q.empty()==false;});
{
int32 data = q.front();
q.pop();
cout<<data<<endl;
}
}
1. Producer에서 cv.notify_one(); 을 한 뒤 Consumer의 cv.wait가 깨어나기 전에 Producer가 unique_lock<mutex> lock(m); 을 걸면 pop을 하지 못하고 queue에 데이터가 연속으로 쌓이는 경우가 있나요?
2. 디버깅을 찍어보니 cv.wait가 처음 수행되었을 때는 cv.notify_one() 없이도 그냥 깨어나던데 cv.wait는 notify를 해줬을 경우만 깨어나지 않나요?
ex) 스레드 Producer, Consumer을 모두 실행 직후 최초 q.push 이후 notify_one 없이 wait가 깨어나 data를 cout 함.
3. notify_one 해줬을 때 cv.wait의 [](){return q.empty()==false;} 조건이 충족되지 않았을 때 대기를 하는데(queue에 아무것도 없는 상태)
이때, queue 에 push를 해주면 별도의 반복 notify_one 작업 없이 바로 깨어나나요?
디버깅을 해보니 notify_one을 걸고 조건 실패하여 대기중일때 queue에 push를 해주니 꺠어나는것 같았습니다.
notify_one은 1회성으로 바로 리턴하고 끝인줄 알았는데 Count가 하나 증가하여 queue에 data가 쌓일때까지 대기하는? 개념인지 궁금합니다.
답변 1
1
1. 네 그렇습니다.
2. 꼭 그렇진 않고, 구조상 깨어나서 허탕칠 가능성도 있습니다. 이를 전문적으로 spurious wakeup이라고 합니다.
https://en.wikipedia.org/wiki/Spurious_wakeup
3. 그 정도로 스마트하게 동작하진 않구요. 깨어났을 때 허탕치고 다시 잠들면, 다시 깨워줘야 합니다.
물론 2번에서처럼 중간 중간에 자연스럽게(?) 잠에서 깨는 경우도 있으니
너무 완벽하게 구조를 이해하려 할 필요는 없습니다.
Memory Pool에서 오버플로우 질문입니다.
0
62
2
포토폴리오 및 진로 관련하여 고민입니다.
0
112
1
포토폴리오 관련 고민입니다.
0
61
1
실무에서도 alloc, 스마트포인터 등을 구현해서 쓰는지 궁금합니다.
0
82
2
성능 테스트 결과
0
103
2
게임 서버 Stateful, Stateless 진로 고민
0
121
1
WaitOnAddress와 Sleep의 차이 질문
0
83
1
궁금한거 있습니다.
0
82
2
JobTimer 구동 스레드
0
107
2
TryPop() 동작 관련 질문
0
81
1
로드맵 C#서버 C++서버 방향성 질문
0
148
2
스레드 id를 출력할떄 메인스레드 id도 출력되나요?
0
73
1
생명주기를 위한 의도적 복사
0
86
2
락프리의 실무에서 사용 질문
0
139
2
32bit threadID와 16비트 상위 WriteFlag에 대해
0
101
2
mutex와 sleep 차이점
0
117
1
실무에서는 어떠한 코드 스타일을 사용하는지 궁금합니다
0
152
2
Stomp Allocator의 Release함수에 대한 질문입니다.
0
96
1
공부법 관련해서
0
183
2
MakeShared 함수 관련
0
114
1
지금까지 서버코어에서 만든 내용에 대해 궁금한 점이 있어서 질문 드립니다.
0
144
2
운영체제관련 질문입니다
0
131
1
send하려는 데이터 크기가 크면 memcpy에서 문제가 발생할 것 같습니다.
0
117
2
메모리 풀 질문있습니다.
0
123
1





