2016-12-16 4 views
2

저는 최근에 멀티 프로세싱을 배우고 있으며 리소스가있는 작업을 마친 시나리오에 부딪혔습니다. 다시 필요로하기 전에 다른 사람이 필요하기는하지만이를 릴리스하고 복용하는 것 외에는 할 일이 없습니다. 다시 :뮤텍스/세마포어를 잠금 해제 한 다음 즉시 잠급니다. 나쁜 연습이나 그것을 할 수있는 방법이 있습니까?

(의사 코드)

while (true) { 
    mutex_lock(resource); 
     /* modify resource */ 
    mutex_unlock(resource); 
     /* wait for someone else to modify resource */ 
} 

문제는이 과정이 차단 된 다른 프로세스가있는 경우에도, 다시 잠 즉시 다음 리소스 잠금을 해제하는 것입니다. 단지 CPU를 포기하지 않았기 때문에 이것이라고 가정 할 수 있습니다.

나는 나쁜 습관을하고 있습니까? 이 문제와 관련된 코드를 특별히 설계하는 것 외에는 주위에 방법이 보이지 않습니다. 거기에 방법이 있나요 yield C/C에서 프로세서 + + 그래서 내가 다시 잠금을하지 않는 보장 할 수 있습니까?

+0

동일한 잠금을 기다리는 스레드가 모두있는 경우 하나의 스레드가 잠금 해제되면 잠금을 대기중인 다른 모든 스레드가 잠금 해제 된 스레드보다 먼저 나타납니다. 따라서이 동작은 정상입니다. server with – bruceg

+1

일반적으로'sleep (0)'은이를 수행합니다 - 운영체제에 이익을 주며, 운영체제가 더 좋은 것을 찾으면 나머지 시간대와 원칙적으로 포기합니다. –

+0

'pthread' API를 사용하고 있습니까? – user3386109

답변

0

신호가 다른 스레드에 의해 트리거 될 때까지 루핑 스레드를 차단하는 신호를 사용합니다. 이 개념을 사용하면 CPU주기를 태우지 않고 필요할 때만 작동합니다. C#에서는 구문 적으로 감미로운 세마포어 (AutoResetEvent)의 형태를 취할 수 있지만 C에서는 좀 더 깊이 들어가야합니다.

다음을보십시오 : https://www.justsoftwaresolutions.co.uk/threading/locks-mutexes-semaphores.html 각 종류의 스레드 보호 장치의 용도를 상기시켜줍니다.

행운을 빌어 요!

+1

신호는 무거 우며 문제가 있습니다. 조건 변수를 가진'pthread_cond_wait()'와 같은 더 좋은 방법이 있습니다. –