2016-11-17 1 views
0

저는 Linux에서 C++로 프로그래밍 중이며 pthreads 라이브러리를 사용하고 있습니다. 일부 공유 변수를 보호하기 위해 뮤텍스를 사용하고 있지만이 특정 경우 뮤텍스를 사용해야하는지 확실하지 않습니다.동시 읽기에서 뮤텍스를 사용하거나 사용하지 않음

3 개의 스레드가 있습니다. 공유 변수는 문자열 (전역 변수)입니다.

Thread1은 값을 변경하고 나중에 thread2와 thread3은 값을 읽고 다른 문자열에 저장합니다.

이 경우 문자열 값은 하나의 스레드에 의해서만 수정됩니다. 두 스레드가 동시 읽기에서 공유 변수를 보호하기 위해 여전히 뮤텍스를 사용해야합니까?

+0

개체를 수정하는 스레드가 하나 이상있을 때마다 뮤텍스가 필요합니다. 당신이 그것을 필요로하지 않을 때 유일한 상황은 * everyone *이 독서 일 때입니다. – Quentin

+0

하지만 Thread1이 이미 값을 수정할 때 Thread2와 3은 문자열 값을 읽습니다. –

+1

다른 스레드가 스레드를 읽기 전에 스레드 1이 스레드 수정을 완료했는지 확인하면 모든 스레드가 읽는 상황에 있습니다. mutex가 필요하지 않습니다. – Quentin

답변

1

사용해야 할 것은 shared_mutex입니다 (C++ 14/17을 사용하지 않으려면 boost에서 가져옵니다) (C++ 14의 경우 사용할 수있는 shared_timed_mutex입니다). 그런 다음 문자열을 읽으려는 경우 shared_lock을 입력하고 문자를 쓰려면 unique_lock을 입력합니다.

두 공유 잠금이 만나는 경우 충돌하지 않고 차단하지 않지만 다른 잠금이 완료 될 때까지 공유 잠금과 고유 잠금이 충돌하고 잠금 중 하나가 차단됩니다.

+0

pthreads 라이브러리를 사용하고 있으며이를 변경하고 싶지 않습니다. 그럼에도 불구하고, 당신의 대답에 감사드립니다. –

+0

@JulenUranga 실제로 pthread를 사용하는지 여부는 관련이 없습니다. 자물쇠는 상관 없어! –

+0

알아! 하지만 구조를 유지하고 스레드와 관련된 동일한 "기능"을 사용하여 프로젝트를 계속 진행하고 싶습니다. –

0

pthread를 사용하고 있으므로 pthread_rwlock_t을 사용할 수 있습니다.

개체를 업데이트하는 경우 쓰기 잠금을 얻으려면 locked using pthread_rwlock_wrlock()이됩니다. 모든 판독기는 공유 읽기 잠금 with pthread_rwlock_rdlock()을 획득 한 후에 만 ​​오브젝트에 액세스합니다. 쓰기 잠금은 배타적이므로 읽기 잠금은 공유되므로 원하는 동작을 얻을 수 있습니다.

pthread_rwlock_t 읽기/쓰기 잠금의 사용 예는 http://www.ibm.com/support/knowledgecenter/ssw_aix_71/com.ibm.aix.genprogc/using_readwrite_locks.htm에서 찾을 수 있습니다.

pthread_rwlock_t 자물쇠에서 사용할 수있는 통화에 대한 요약은 https://docs.oracle.com/cd/E19455-01/806-5257/6je9h032u/index.html에서 확인할 수 있습니다. 필요가 없다 "나중에"다른 스레드가 은 변경 후를 만든 것을 의미하는 경우 -

Operation 

Initialize a read-write lock     "pthread_rwlock_init(3THR)" 

Read lock on read-write lock     "pthread_rwlock_rdlock(3THR)" 

Read lock with a nonblocking read-write lock "pthread_rwlock_tryrdlock(3THR)" 

Write lock on read-write lock     "pthread_rwlock_wrlock(3THR)" 

Write lock with a nonblocking read-write lock "pthread_rwlock_trywrlock(3THR)" 

Unlock a read-write lock      "pthread_rwlock_unlock(3THR)" 

Destroy a read-write lock      "pthread_rwlock_destroy(3THR)" 
1

"Thread1이 ... 그것의 값을 변경하고 나중에"나는 작업을 나열하는 테이블을 재현 한 뮤텍스의 경우; 스레드 생성은 메모리를 동기화합니다. 다른 무엇보다도 의미가 있다면 어떤 형태의 동기화가 필요합니다. 부분적으로는 다른 스레드에서 "이후"가 동기화 없이는 의미가 없기 때문입니다.

+0

당신이 말했듯이 (다른 스레드에서 "이후"는 동기화없이 의미가 없습니다) 동기화는 뮤텍스를 사용하여 이루어졌습니다. 그렇다면 보호 할 필요가 없습니다. 고맙습니다! –

+0

@JulenUranga - 뮤텍스는 ** 뭔가 다른 것 후에 ** 어떤 일이 발생한다고 보장하지 않습니다. 그것이하는 것은 그들이 동시에 일어나지 않도록 보장하는 것입니다 (느슨하게 말하면). 값이 다른 스레드에 의해 쓰여진 후에 스레드가 값을 읽을 필요가 있다면 값이 이미 쓰여 졌음을 알리는 방법이 필요합니다. –

관련 문제