2012-06-15 3 views
1

스레드가 sleep 다른 스레드에 의해 실행될 때 어떤 일이 발생합니까? 실행 중간에 주 스레드가 가능합니까?실행 중간에 스레드 잠들기

나는 함수가 Producer 인 것으로 가정합니다. 한 단위 생산 도중 생산자가 Consumersleep() 인 경우 어떻게해야합니까?

유닛이 절반 생산 된 것으로 가정하십시오. 그 다음에 그것은 sleep()에 놓는다. 시스템의 무결성이 문제가 될 수 있음

+1

스레드가 다른 스레드에게 절전 모드로 명령 할 수 있다는 것을 알지 못했습니다 ... – Tudor

+0

다른 시스템을 잠자기 상태로 만들 수있는 시스템이있을 수 있지만, Boost.thread에서는 스레드를'sleep'을위한 대상으로 지정할 수 없습니다. ** 스레드는 ** 현재 스레드를 일시 중단합니다. .. "] (http://www.boost.org/doc/libs/1_49_0/doc/html/thread/thread_management.html#thread.thread_management.thread.sleep) [강조 추가]. –

+0

글쎄요, 쓰레드가 다른 쓰레드를 대기 상태로 만들 수 없다는 사실을 몰랐습니다. 그러나 스레드가 폴링하여 실행할 수있는 순서를 큐에 넣을 수 있습니다. –

답변

0

스레드가 잠자기 상태 일 때 어떤 상태가 변경되지 않으면 절전 모드가 아닌 다른 값 세트로 깨어납니다.

스레드는 CPU에 의해 항상 실행되고 전환되지만, 데이터 경합이나 다른 버그가 없다고 가정하면 실행의 전체 결과에 영향을 미치지 않습니다.

+0

입니다. 예를 들어 절반 인 경우 생성 후'sleep()'이 호출된다. 그렇다면 문제가없는 상황이 있습니까? –

+0

스레드가 잠자는 동안 다른 스레드가 항목과 간섭하지 않으면 아무런 문제가 없어야합니다. – Tudor

3

sleep이 호출 된 스레드는 스레드 스케줄러에 의해 대기열에 넣어지고 실행중인 CPU에서 컨텍스트가 전환되므로 다른 스레드가 그 위치를 차지할 수 있습니다 .

모든 컨텍스트 (레지스터, 스택 포인터, 기본 포인터 등)는 스레드 스택에 저장되므로 다음에 실행할 때 중단 된 부분부터 계속할 수 있습니다.

운영체제는 여러 가지 작업을 수행하는 것처럼 보이게하기 위해 스레드간에 컨텍스트 스위치를 끊임없이 수행합니다. OS 스레드 스케줄러 알고리즘이이를 처리합니다.

스레드 스케줄링과 스레딩은 큰 문제입니다. 실제로 이해하고 싶다면이 글을 읽으시기 바랍니다. :)

편집 :

+0

그러나 유닛이 '반 생산'이라고 가정합니다. 그리고'sleep()'에 놓는다. 시스템의 무결성이 문제가 될 수 있습니다. 생산시 아이템을 생성하고 저장해야한다고 가정하면 –

0

이 강제로 동 기적으로 하나 개의 스레드에 대한 바람직하지 않다 것 등이 아니라, 당신이 다른 스레드를 기다리는 스레드에게 적절한 동기화 메커니즘을 사용해야 조언 스레드 동기화 목적으로 sleep 사용 다른 스레드의 실행을 방해합니다. 한 스레드는 비동기 메시지를 다른 방법으로 재전송한다는 요청을 보낼 수는 있지만 다른 스레드가 적절한 상태에있을 때 처리하게됩니다.

스레드 안전성이있는 채널을 사용하여 통신한다고 가정하면 잠자는 스레드가 결국 깨어나서 작업 대기열에서 데이터를 가져 오거나 일부 세마포어가 설정되어 있는지 확인하고 처리 된 데이터를 읽으므로 잘못된 결과는 발생하지 않습니다.

상태를 변경하는 비 휘발성 변수 또는 직접 함수 호출을 사용하여 스레드가 통신하는 경우, 이는 잘못된 것이 발생할 때입니다.

0

스레드가 강제로 다른 스레드를 잠자기 상태로 만드는 방법을 모르겠습니다. 두 스레드가 공유 리소스 (예 : Produce/Consumer 예제처럼 보일 수있는 입출력 대기열)에 액세스하는 경우 두 스레드가 모두 동일한 잠금을두고 경쟁 할 수 있습니다. 논쟁이 "trylock"버라이어티가 아닌 경우, 잃어버린 스레드는 다른 스레드가 잠금을 해제 할 때까지 기다려야합니다. 대기중인 스레드는 잠금과 연관된 대기 대기열에 배치되고 스케줄러 실행 대기 행렬에서 제거됩니다. 승리 한 스레드가 잠금을 해제하면 코드는 대기열을 검사하여 스레드가 여전히 스레드를 획득하려고 대기 중인지 확인합니다. 존재하는 경우, 하나가 승자로 선택되고 잠금이 제공되고 스케줄러 실행 큐에 놓입니다.