참고로 윈도우에서 작업중이다. 리눅스 아녀.
아무리 생각해도 정답! 이라고 볼만한게 안보인다.
스토리는 이래
모듈이 있고 애랑 serial 통신해. 모듈에서 오는 속도는 데이터를 받아서 처리하는 속도보다 빠를 수 있어.
이게 무슨 말인고 하니. 모듈은 야! 만해도 나는 창문열고 치약 바르고 미싱해야할 수도 있다는거지.
여하튼 모듈 -> serial 모듈(내가 짠거) -> serial를 쓰는 어플리케이션. 이렇게 있는거야.
위에서 이야기했듯이 시리얼에서 데이터가 빨리오고 나는 처리하는 속도가 느리기 때문에 데이터들을 queue에다가 쌓아놓고 처리할려고 해.
문제는.. c++에서 queue에 데이터가 새로 들어왔는지 확인할때 깔끔한 방법이 안 보인다는거지;;
후보군 1. waitforsingleobject
애 제일 큰 문제는 setevent를 몇번을 날렸는지 알 수가 없어.
후보군 2. pooling
가장 확실한 방법이지만 지금 고민되는게 cpu사용량... 내가 알기론 block, non block으로 작동되는 시그널 프로세스들도 안에보면
pooling을 사용한다고 들음. 그런면에서 pooling도 나쁘진 않을것도 같은데.. 여하튼. 계속 돌면서 새로운 놈 들어왔나 체크하는거지.
딴거 없나... 다른 언어들은 몇가지 생각이 나는데 c++로 하자니 참.. 좆..
일단, 풀링 (pooling)과 폴링 (polling)은 전혀 다른 개념. 너가 말한 건 polling.
그냥 mutex랑 condition_variable 쓰면 되지 않냐
큐의 데이터 개수를 따로 기억하고 있으면 되잖. 이벤트 들어오면 그 개수 한꺼번에 다 인출하면 되고.
흐음.. 생각중..
다만 큐 처리에서 race condition을 해결하지 않으면 문제가 생기는 건 알지?
맞어! 간단한거였네.. 왜 이렇게 삽질했지. 땡유!
알지. in out mutex로 묶고 돌리면 미스나는거 없겠지.
그리고 폴링 방식에서 busy waiting으로 인한 cpu 사용량이 걱정인 거면 Sleep (1); 하면 됨. 그건 큰 문제가 아님. 다만 폴링도 결국엔 큐 방식으로 짜지 않으면 데이터 유실이 발생하기 쉽다.
ㄴ 그럴까? .. Sleep은.. 경험상 많이 돌리면 스위칭 문제가 많이 생겨서 그거말고 peekmessage랑 뭐랑 묶어서 쓰는거 따로 만들어서 쓰거든. 그런데 뭐 1번 방식으로 문제없이 되겠네
GetMessage나 Sleep이나 ㅡ.,ㅡ thread yielding (task switching) 일어나는 건 피차 일반.