2013-02-01 4 views
6

대부분의 언어/프레임 워크에서 스레드가 다른 스레드에 제어 권한을 부여 할 수있는 방법이 있습니다. 그러나 스레드로부터 수익을내는 것이 주어진 문제에 대한 올바른 해결책이라고 생각할 수는 없습니다. 일반적으로 Thread.yield(), sleep(0) 등을 사용해야 할 때?일반적으로 쓰레드가 언제 생성되어야합니까?

답변

6

하나의 사용 사례는 동시 프로그램을 테스트하는 데 사용할 수 있습니다. 동기화 패턴의 결함을 나타내는 인터리브를 찾으십시오. 자바 예를 들어 :

보다 효과적으로 그러므로 interleavings 수, 증가 프로그램의 상태 공간을 탐험을위한 유용한 트릭, 이다 사용 Thread.yield더 많은 컨텍스트를 장려하기 작업에 대한 액세스 중에 전환 공유 상태. (이 기법의 효과는 플랫폼에 따라 다릅니다. JVM은 no-op [JLS 17.9]로 THREE.yield를 처리 할 수 ​​있으므로 이 짧지 만 0이 아닌 잠자기를 사용하면 속도가 느리지 만 안정적입니다.) - JCIP 자바 관점에서 또한

흥미 시맨틱이 정의되지 않은 것이있다 :

의미론 Thread.yield (및 Thread.sleep(0))는 정의되지의 [JLS 17.9]; JVM은 no-ops로 구현하거나 스케쥴 힌트로 을 처리 할 수 ​​있습니다. 특히, 그들은 유닉스 시스템에서 sleep (0)의 의미를 가질 필요가 없습니다. 우선 순위의 실행 대기열 끝에있는 의 현재 스레드 의 다른 스레드로 동일한 우선 순위를 갖는 일부 JVM이 이 방법. - JCIP

이렇게하면 신뢰성이 떨어집니다. 이것은 일반적으로 내가 다음 믿는다에서 사실이다, 그러나 매우 자바는 특정 :

은 모두 예약 주문에 영향을 사용할 수있는 낮은 수준의 메커니즘입니다. 이것이 특정 기능을 수행하는 데 사용되면이 기능은 오히려 나쁜 생각 인 OS 스케줄러의 확률을 기반으로합니다. 대신 높은 수준의 동기화 구문으로 관리해야합니다.

테스트 목적이나 특정 상태로 프로그램을 강제 실행하는 데는 유용한 도구처럼 보입니다.

+0

위로 싱글 태스킹 시스템 위에 멀티 스레드 커널을 작성하는 경우, 정확히이 목적을 위해 타임 슬라이스 기간을 제어하는 ​​디버깅 도구가 있습니다. 몇 가지 기계 지침마다 선제 적 비 분산을 강요 할 때 스레드 안전 코드가 얼마나 많이 충돌 할 것인지 놀라 울 정도입니다. 유용하지 않은 것은 그 속도로 완료되지만, 당신은 확실히 버그를 찾는다! –

+0

@RossPatterson 실제로 그것에 대해 듣기 좋은 곳입니다. –

3

운영 체제 스케줄러가 당신을 위해 계속 결정합니까?

sleep (0)이 절대적으로 필요한 경우와 일치 할 때까지 절대로 절대로 절대로 절대로 (0) 절대로 절대로 기록하지 마십시오.

컨텍스트 스위치가 너무 비싸서 많은 사람들이 더 많은 컨텍스트 스위치를 원한다고 생각하지 않습니다.

+1

'sleep (0)이 절대적으로 필요한 경우와 일치하고 여기에 문서화 할 때까지 절대 절대로 절대로 절대로 (0) 절전하지 않습니다.' - 오, 우리 아기끼리 가질 수 있을까? (나는 남성이다). –

3

일반적으로 Thread.yield(), sleep (0) 등을 사용해야합니까?

VM에 따라 달라지는 것은 스레드 모델입니다.나에 대한 대답은 거의 경우 희소하다.

전통적으로 일부 스레드 모델은 비 선점 형이었고 다른 모델은 성숙하지 않았으므로 Thread.yield()이 필요합니다.

나는 이 C에서 register을 사용하는 것과 같다. 우리는 프로그래머가 컴파일러보다 더 좋았 기 때문에 우리 프로그램의 성능을 향상시키는 데 의존했다. 그러나 현대의 컴파일러는 이고,보다 더 똑똑한입니다. 요즘은 프로그래머가 실제로 registerThread.yield()을 사용하여 프로그램의 성능을 향상시킬 수 있습니다.

관련 문제