그러니까 쓸려고 하는 녀석이 발생을 하면 우선 다른 녀석들이 읽지를 못하도록 공유 메모리 변수를 두어 그 변수를 1로 셋해주고 공유메모리의 카운트 값이 0일 될때 까지 기다렸다가 쓰고 나서
다시 다른 공유메모리의 변수를 0으로 셋 하게 되면 다른 스레드나 프로세서 들이 읽을수 있도록 하는 것입니다.
하나 혹은 그 이상의 reader 가 pthread_rwlock_rdlock 로 the read-write lock 에 대해 read lock 을 가지고 data 를 읽고 있는 사이에, 새로운 writer 가 pthread_rwlock_wrlock 로 the read-write lock 을 얻으려 할 때, 어떤 일이 벌어 지나요?
예상 답] 모든 reader 들이 read lock 을 모두 release 한 후에야 writer 가 read-write lock 을 acquire 할 수 있다. <- 이게 맞는 건가요?
다들 자기 이야기 밖에 할 줄 모르는 세상에서,
메아리 같은 사람 하나 필요할 거 같아서...
혹 원래 질문을 하신 분께서 pthread_rwlock_* 로 만족하신다면 별 다른 이견 없습니다 :)
제가 원래 질문의 의도를 잘못 이해했었습니다. 저는 writer 가 non-blocking 이 되는 것을 원하시는 줄 알았거든요. 그런 protocol 로 있기는 해서요. 혹 관심 있으시면 여기 간략하게 적어 두겠습니다.
혹 관심 있으신 분들을 위해 레퍼런스를 달았습니다. 그리고, reference 에 나와 있는 protocol 은 'single writer - multiple readers' 의 경우입니다. 'multiple writers - multiple readers' 의 경우는 아래 protocol 에 약간의 변경을 통해 해결 할 수 있을 겁니다.
The Non-blocking Write (NBW) Protocol
Hermann Kopetz - REAL-TIME SYSTEMS: Design Principles for Distributed Embedded Applications, Kluwer Academic Publishers, 1997, Chap. 10.2.2, page 217-218.
The protocol requires a concurrency control field (CCF) and atomic access to the CCF must be guaranteed.
Initialization:
CCF := 0
Writer:
start: CCF_old := CCF;
CCF:= CCF_old +1;
<write into data structure>
CCF := CCF_old + 2;
Reader:
start: CCF_begin := CCF;
If CCF_begin == odd // 지금 writer 가 쓰는 중!!!
then goto start;
<read data structure>
CCF_end := CCF;
If CCF_end != CCF_begin // 내가 읽는 도중 writer 가 쓰기 시작 했음!!!
then goto start;
다들 자기 이야기 밖에 할 줄 모르는 세상에서,
메아리 같은 사람 하나 필요할 거 같아서...
쓸때만 자료구조(트리, 해쉬등)에 락을 걸어주면 될듯 한데요...
쓸때만 자료구조(트리, 해쉬등)에 락을 걸어주면 될듯 한데요...
쓸때는 물론 읽는것도 안되야 겠죠..^^;;
쓸때 읽으면 잘못된 데이터를 읽을수도 있으니까요..
어차피 뮤텍스 같은 방법을 사용하여 제어 해야 할것 같습니다.
굳이 뮤텍스만은 아닙니다..^^
[quote="bear"]쓸때만 자료구조(트리, 해쉬등)에 락을 걸어주면
목표는 말씀하신데로 쓸때만 자료구조에 락을 거는 겁니다.
그런데 그렇게 하면, 두개 이상의 쓰레드나 프로세스가 동시에 쓰는것은 막아주지만, 다른놈이 읽고 있을때 쓰려는 놈이 접근하면 그걸 제지할 방법이 없는것 같아 난감합니다.
그러면 공유 메모리를 쓰는것은 어떨까 합니다.읽는 스레드나 프로세
그러면 공유 메모리를 쓰는것은 어떨까 합니다.
읽는 스레드나 프로세스를 카운트 하는겁니다.
그렇게 해서 0일때만 쓰기를 하는것입니다.
0일때 락을 발생 시키고 쓰면 될것 같습니다.
그러니까 쓸려고 하는 녀석이 발생을 하면 우선 다른 녀석들이 읽지를 못하도록 공유 메모리 변수를 두어 그 변수를 1로 셋해주고 공유메모리의 카운트 값이 0일 될때 까지 기다렸다가 쓰고 나서
다시 다른 공유메모리의 변수를 0으로 셋 하게 되면 다른 스레드나 프로세서 들이 읽을수 있도록 하는 것입니다.
그러니까 정리하면..^^;;;
공유메모리로 2개의 변수를 두어 제어 하는 거죠..
하나는 읽는 스레드나 프로세서의 갯수를 저장하는 변수와 하나는 쓰고 있다고 알려주는 변수
2개를 가지고 제어 하면 될것 같습니다.^^;;
pthread_rwlock_* 을 사용하는 경우가 아닌가요?
pthread_rwlock_* 을 사용하는 경우가 아닌가요?
켁~ bugiii 님께서 단 한줄로 찾던 답을 주셨네요.. :roll
켁~ bugiii 님께서 단 한줄로 찾던 답을 주셨네요.. :roll:
원래 알고나면 다 쉬운거겠죠? 감사합니다.
그럼 진작에 pthread 쓰신다고 말씀을 하셨으면..ㅠㅠ그쪽에서
그럼 진작에 pthread 쓰신다고 말씀을 하셨으면..ㅠㅠ
그쪽에서 찾아 봤을텐데.ㅠㅠ
프로세스도 언급을 하셔서.ㅠㅠ
왠지 초라해진 기분이네요.ㅋㅋ
빠샤 저도 더욱 노력 해야 겠네요..^^
pthread_rwlockattr_* 프로세스간 rwlock 도 가능합니
pthread_rwlockattr_* 프로세스간 rwlock 도 가능합니다.
p.s. 죄송합니다.
[궁금] reader 가 읽고 있는 도중 writer 가 쓰고 싶어 할 때..
궁금해서 물어 봅니다.
하나 혹은 그 이상의 reader 가 pthread_rwlock_rdlock 로 the read-write lock 에 대해 read lock 을 가지고 data 를 읽고 있는 사이에, 새로운 writer 가 pthread_rwlock_wrlock 로 the read-write lock 을 얻으려 할 때, 어떤 일이 벌어 지나요?
예상 답] 모든 reader 들이 read lock 을 모두 release 한 후에야 writer 가 read-write lock 을 acquire 할 수 있다. <- 이게 맞는 건가요?
다들 자기 이야기 밖에 할 줄 모르는 세상에서,
메아리 같은 사람 하나 필요할 거 같아서...
혹 관심 있으시다면..
혹 원래 질문을 하신 분께서 pthread_rwlock_* 로 만족하신다면 별 다른 이견 없습니다 :)
제가 원래 질문의 의도를 잘못 이해했었습니다. 저는 writer 가 non-blocking 이 되는 것을 원하시는 줄 알았거든요. 그런 protocol 로 있기는 해서요. 혹 관심 있으시면 여기 간략하게 적어 두겠습니다.
혹 관심 있으신 분들을 위해 레퍼런스를 달았습니다. 그리고, reference 에 나와 있는 protocol 은 'single writer - multiple readers' 의 경우입니다. 'multiple writers - multiple readers' 의 경우는 아래 protocol 에 약간의 변경을 통해 해결 할 수 있을 겁니다.
The Non-blocking Write (NBW) Protocol
Hermann Kopetz - REAL-TIME SYSTEMS: Design Principles for Distributed Embedded Applications, Kluwer Academic Publishers, 1997, Chap. 10.2.2, page 217-218.
The protocol requires a concurrency control field (CCF) and atomic access to the CCF must be guaranteed.
다들 자기 이야기 밖에 할 줄 모르는 세상에서,
메아리 같은 사람 하나 필요할 거 같아서...
댓글 달기