2017-11-30 3 views
0

일부 스레드를 수동 대기 모드로 설정하고 장벽에 도달 할 때 깨우는 방법을 알아 내려고합니다. 도착해야 할 고정 된 양의 스레드가 있습니다.C에서 스레드의 수동 대기 FIFO를 만드는 방법은 무엇입니까?

처음 세마포어를 0으로 초기화하면 차단되지만 무작위로 릴리스됩니다. 나는 FIFO와 같은 동기화의 장벽에 이른 순서로 스레드를 풀어주는 시스템을 구현하고 싶다.

나는 또한 2 개의 세마포어를 사용하는 것에 대해 생각하고, 차단하고, 스레드를 풀어서 정렬합니다. 쓰레드가 좋은 것이라면 그냥 간다. 그렇지 않다면 두 번째 세마포어에 의해 막힌다. 그러나이 시스템은 길고 까다 롭습니다.

나에게 도움이되는 제안이나 아이디어가있는 사람이 있습니까?

은 대단히 감사합니다 :)

+0

'나는 좋겠다'- 그것은 확고한 요구 사항입니까? 그렇지 않으면 피할 수없는 난장판입니다. 일반적으로 사용자가 제안하는 것과 같은 명령을 시행하는 것이 가장 피해야하는 디자인입니다. 그것은 수행 될 수 있지만 장벽에서 해제 된 모든 스레드 X는 그 이후에 즉시 릴리스되는 스레드 X + 1을 선점 할 수 있기 때문에 '유사'는 실제로 실행 가능하거나 유용하지 않습니다. –

+0

내 말은, 보장과 무시할 수없는 이점을 제공하는 여분의 시스템 콜을 많이 만들어야 할 필요가 있다면, 그들 모두가 CS를 입력하게하고 마지막을 제외한 모든 것이 세마포어를 가져 와서 대기열 컨테이너에 넣고 CS를 종료하고 sema를 차단하십시오. 마지막 스레드가 들어 오면 .it은 세마포어를 큐에서 제거하고, 순서대로 신호를 보내고, CS 자체를 종료하고 계속할 수 있습니다. –

+0

Re, "일부 스레드를 수동 대기 모드로 설정하고 장벽에 도달 할 때 깨우십시오." 그건 말이 안돼. 스레드는 수동적으로 기다리고있는 한 결코 "장벽에 도달하지"않습니다. 일반적으로 "장벽"이라고 말하면 "장벽에 도달"하는 것이 스레드를 대기시키는 원인이되는 상황을 의미합니다. –

답변

0

리눅스에서 방금 같은 FIFO 순서로 스레드를 차단하고 차단을 해제 조건 변수와 뮤텍스를 사용할 수 있습니다.

이것은 조건 변수의 모든 웨이터가 커널의 퓨터 대기 대기열에 순서대로 추가되기 때문입니다. 웨이터를 깨우는 것은 동일한 FIFO 순서로 발생합니다. 조건 변수에 신호를 보내는 동안 뮤텍스를 잠근 상태로 유지하는 한.

그러나 주석 작성자가 언급했듯이 스레드 실행 순서에 의존하는 것은 좋지 않습니다.

+0

고맙습니다. 나는 그것이 효율적이지 않다는 데 동의한다. 그것은 실제로 내가 가진 임무입니다. 각 스레드는 대기실의 클라이언트를 나타냅니다. 따라서 대기 시간 동안 CPU 자원을 사용하지 않아야합니다. 각 클라이언트는 그가 도착한 순서대로 릴리스되어야합니다. – MaxUt

관련 문제