2017-12-27 4 views
1

의 동기화가 나는이 문제를C++ - 나는 방법 C를 입력하고 foo는 다시로드 시작하면 스레드

Foo * foo = new Foo(); 

void A(){ 
    foo->a(); 
} 

void B(){ 
    foo->b(); 
} 

void C(){ 
    foo->reloadAll(); 
} 

을 가지고, 나는 그러나 A 또는 B를 호출 할 해달라고, A 또는 B를 함께 호출 할 수 있습니다. 이 경우 스레드를 잠그고 싶지 않습니다.

어떻게 동기화합니까? C++ 14에서 제공하는 기능을 사용할 수 있습니다. 현재, 나는 원자 변수에 대해 활성 대기 (sleep with loo)를 사용하고 있지만 이상적이지는 않습니다.

EDIT : 스레드에서 A, B 또는 C를 호출하는 것은 GUI (다른 언어로 작성)로 실행되므로 C++ 응용 프로그램에는 실제 스레드가 없습니다.

+1

C가 호출되었을 때 A 또는 B가 이미 실행 된 경우 어떻게해야합니까? – Jeka

+0

@Jeka A 또는 B가 실행 중일 때까지 기다렸다가 C가 끝날 때까지 기다리십시오. –

+0

'std :: shared_mutex'를 사용하고'A'와'B'에'lock_shared()'를 호출하는 것을 고려할 수 있습니다 – LWimsey

답변

3

내가 가장 좋은 옵션은 shared_mutex이고, 방법 C는 고유 잠금을 사용해야하지만 A와 B는 공유 잠금을 사용한다. 사용 가능한지 확인한다.

또한 try_lock_shared를 사용하여 C가 잠긴 대신 A와 B에서 돌아갈 수 있습니다.

+0

Shared_mutex는 C++입니다. –

+2

@MartinPerry -하지만'std :: shared_timed_mutex'는 C++ 14입니다. 타이밍 기능은 선택 사항입니다. – StoryTeller

4

독자에게 문제가되는 것처럼 보입니다. A와 B는 독자로, C는 작가로 잠글 필요가 있습니다. 여기를 보아라 : Reader/Writer Locks in C++

+0

대답은 주로 부스트 또는 오래된 C/C++를 사용하고 있습니다. –

+0

@MartinPerry : 다른 말로하면, C++ 14 **에서 Reader/Writer lock * 기능 * avaiable **이 필요합니다. 질문을 공식화하지 않고 (적절한 제목을 선택하십시오) 왜 그렇게하지 않습니까? 현재 귀하의 질문은 심지어 독자 (패턴으로)에 대해 모르는 것처럼 보이기 때문에 정답이 합법적이며 가장 좋은 점수를 얻을 가능성이 큽니다. – Tsyvarev

0

두 개의 unique locks을 하나는 a, 하나는 b를 어떻게 사용합니까? a/b가 시작될 때 잠금, a/b가 끝날 때 잠금 해제, c 모두 잠금/잠금 해제?

관련 문제