2013-02-01 7 views
0

독자에게 쓰레드에 대한 질문이 있었으며 과도하게 복잡하게하지 않으려 고했기 때문에 조언을 구하기 위해 여기에 왔습니다.C++ 세마포어 (읽기/쓰기)

필자는 궁극적으로 4 개의 스레드로 읽고 3을 쓰는 배열을 가지고 있습니다 (1 개의 판독기 3 개의 읽기/쓰기). 내 목표는 어떻게 든 모든 읽기 작업이 완료 될 때까지 모든 스레드를 차단하는 쓰기 작업을하는 동안 다른 스레드를 차단하지 못하게하는 것이 었습니다. 나는 스레드 당 하나의 세마포어로이를 수행하는 방법을 알고 있지만 실제로는 하나의 바이너리, 카운팅 또는 뮤텍스 세마포어 (또는 스레드 당 1 개 미만의 세마포어)로이를 수행하는 방법은 무엇인지 알고 있습니다. 나는 VxWorks 세마포어 라이브러리를 사용할 것이다.

답변

1

VxWorks가 shared/rwlock like the POSIX one의 어떤 종류를 지원하지 않는 한, 그것은 단순한 것보다 조금 더 복잡 할 것 같습니다.

갖고 계시다면 POSIX pthread_rwlock_t을 사용하시기 바랍니다. 그렇지 않으면 VxWorks는 다른 대안을 제공하지 않습니다. 다른 기본 요소를 사용하여 빌드해야합니다. 2 개의 세마포어와 3 개의 뮤텍스와 2 개의 정수 변수 위에 rwlock을 만들 수 있습니다. Concurrent Control with "Readers" and "Writers"; P.J. Courtois, F. Heymans, and D.L. Parnas; MBLE Research Laboratory; Brussels, Belgium을 참조하십시오.

+0

이것은 실제로 불행히도 vxWorks 6.6 이상에서만 지원됩니다. 그렇지 않으면 다른 사람들처럼 "독자와 작가"문제인 것처럼 보입니다. – SirRoot

0

독자가 하나이기 때문에 상호 배제 문제 (정확히 하나의 스레드 만 가능)와 동일합니다. 단일 바이너리 세마포어를 직접 사용하면 충분합니다. 1로 시작하고, P는 들어가고, V는 떠난다.

+1

읽기/쓰기 스레드는 특정 시나리오에서만 쓰기 때문에 더 자주 읽는 것이 좋습니다. 나는 4 개의 쓰레드가 읽을 때 서로를 차단하지 않기를 바랬다. – SirRoot

+0

@SirRoot 그런 경우 http://en.wikipedia.org/wiki/Readers-writers_problem을 구현할 수 있습니다. 그러나 서로를 막는 독자 들보 다 더 빠를 수는 없습니다. – zch