2010-11-26 11 views
6

En C y C++, ¿hay una forma multiplataforma de producir un hilo? Algo como sched_yield() o Sleep (0)? ¿SDL_Delay (0) siempre cede o volverá inmediatamente en algunas implementaciones?¿Forma de plataforma cruzada para producir un hilo en C/C++?

+5

rendimiento() es a menudo un mal diseño. Si necesita esperar algo, espere de forma explícita a través de un evento, señal o condición de algún tipo. –

+0

Tenga en cuenta que es imposible escribir una versión de "rendimiento" que * siempre * ceda. ¿Qué pasa si no hay otro hilo para ceder * a *? Diría que SDL_Delay de SDL (0) hace exactamente lo que usted quiere. –

Respuesta

9

Dado que ni C ni C++ (hasta C++ 98) tienen "hilos", no existe una forma completamente multiplataforma para que un hilo ceda.

En C++ 0x, hay una función std::this_thread::yield() que se puede invocar para ceder. Esa será la forma portátil de que un hilo ceda, una vez que las personas comiencen a usar la biblioteca de hilos C++ 0x.

+0

Me doy cuenta de que esto no está incorporado en el lenguaje. Principalmente me pregunto si hay una biblioteca disponible que hace esto, de ahí el comentario sobre SDL_Delay. – Shum

+0

@Shum: cualquiera que sea la biblioteca de threading que esté utilizando probablemente tenga una. ¿Qué biblioteca de hilos * estás * usando? –

+0

@Shum: tan pronto como dice "biblioteca", la única respuesta es "tal vez, depende de qué plataformas admita la biblioteca y qué funcionalidad ofrece la biblioteca". –

4

en el caso de C++, boost::thread::yield() hace lo que pide. En plataformas con subprocesos posix, pthread_yield() realiza la misma función para C y cualquier cosa que se vincule con ella. En las plataformas donde esto no detiene inmediatamente el hilo y comienza otro, es porque el planificador no admite esa funcionalidad. No creo que muchas de esas plataformas realmente existan en la naturaleza.

+0

El rendimiento no tiene que iniciar otro hilo; el programador podría reanudar inmediatamente el hilo que produjo. –

+1

@James: redacción acordada y ambigua, pero considerada desde la perspectiva de los programadores de división de tiempo, esa línea refleja que cualquier nuevo subproceso aún esperaría la porción existente antes de tener alguna posibilidad de ser programado, en lugar de comentar si otro subproceso realmente toma su lugar. –

+0

En Windows (que por supuesto no tiene subprocesos POSIX), esencialmente se llama 'Sleep' con un límite de tiempo de 0 para ceder. –

Cuestiones relacionadas