2010-11-26 3 views
6

C 및 C++에는 스레드를 생성하는 플랫폼 간 플랫폼이 있습니까? sched_yield() 또는 수면 (0)과 비슷한가요? SDL_Delay (0)는 항상 일부 구현에서 즉시 생성되거나 즉시 반환됩니까?C/C++에서 스레드를 생성하는 플랫폼 간 방법은 무엇입니까?

+5

yield()는 종종 나쁜 디자인입니다. 당신이 무언가를 기다릴 필요가 있다면, 이벤트, 신호 또는 어떤 종류의 조건을 통해 명시 적으로 기다립니다. –

+0

항상 "yield"버전을 작성하는 것은 불가능합니다. *에 *를 양보 할 다른 스레드가 없다면? 나는 SDL의 SDL_Delay (0)가 당신이 원하는 것과 정확히 일치한다고 말할 것이다. –

답변

9

C 또는 C++ (C++ 98까지)에 "스레드"가 없으므로 스레드가 생성 할 수있는 플랫폼 간 플랫폼이 전혀 없습니다.

C++ 0x에는 yield로 호출 할 수있는 std::this_thread::yield() 함수가 있습니다. 일단 사람들이 C++ 0x 쓰레드 라이브러리를 사용하기 시작하면 쓰레드가 양보 할 수있는 이식성있는 방법이 될 것입니다.

+0

나는 이것이 언어에 내장되어 있지 않다는 것을 알고 있습니다. 나는 주로 SDL_Delay에 대한 주석을 사용하는 라이브러리가 있는지 궁금해하고 있습니다. – Shum

+0

@Shum : 사용중인 모든 스레딩 라이브러리에 가능성이 있습니다. 어떤 스레딩 라이브러리 *를 사용하고 있습니까? –

+0

@Shum : "라이브러리"라고 말하면 유일한 대답은 "어쩌면 라이브러리가 지원하는 플랫폼과 라이브러리가 제공하는 기능에 달려 있습니다." –

4

(C++ 케이스의 경우 boost::thread::yield()) posix 스레드가있는 플랫폼에서 pthread_yield()은 C 및 그와 연결된 모든 기능에 대해 동일한 기능을 수행합니다. 스케줄러가 그 기능을 지원하지 않기 때문에 이것이 즉시 스레드를 중지시키지 않고 다른 스레드를 시작하지 않는 플랫폼에서는 그렇습니다. 나는 그러한 많은 플랫폼이 실제로 야생에 존재하지 않는다고 생각한다.

+0

Yielding은 다른 스레드를 시작할 필요가 없습니다. 스케줄러는 즉시 생성 된 스레드를 다시 시작할 수 있습니다. –

+1

@James : 합의 된 모호한 표현이지만 타임 슬라이싱 스케줄러의 관점에서 보았을 때, 그 라인은 새로운 스레드가 스케쥴링 될 가능성을 갖기 전에 기존의 슬라이스를 기다리는 것을 반영합니다. 그 자리를 차지하십시오. –

+0

Windows (물론 POSIX 스레드는 없음)에서 본질적으로 시간 제한이 0 인 "Sleep"이 호출됩니다. posix 스레딩에서 –

관련 문제