2009-09-27 12 views
10

sé que no existe el concepto de hilos de la corriente C++, pero this article is saying:¿Los flujos de salida estándar en C++ son seguros para subprocesos (cout, cerr, clog)?

Un typesafe, multi-hilo, portátil mecanismo de registro

.....

La función fprintf() es threadsafe, por lo que incluso si este registro se utiliza desde diferentes hilos, las líneas de salida no se codificarán.

¿Qué hay de cout, cerr y clog?

Creo que esta pregunta es aplicable a todo tipo de tipos de flujo en C++ también, como fstream y stringstream.

+2

[Nota: la respuesta es ahora "sí", en C++ 11] (http://stackoverflow.com/a/6374525/87234). – GManNickG

+0

@GManNickG: uso Visual Studio 2013 C++ y cout todavía no es seguro para subprocesos. las salidas en la pantalla están mayormente corruptas/entremezcladas. –

+0

@MehmetFide: la seguridad del subproceso es diferente de la sincronización (cadenas mixtas/intercaladas); C++ 11 estándar garantiza que la implementación no conduce a razas de datos al usar estos objetos de diferentes subprocesos, mientras que depende de usted asegurarse de que múltiples llamadas 'operator <<' estén sincronizadas. – legends2k

Respuesta

8

El artículo hace una afirmación sobre el estándar POSIX para la API fprintf. No dice nada sobre las transmisiones en C++. Y esto es bastante correcto, ya que no existen tales garantías en esas transmisiones.

Tenga en cuenta que aunque la clase de registro en ese artículo utiliza sintaxis de secuencia C++, lo hace a través de un objeto std::ostringstream que se crea y destruye para cada evento de registro y no se comparte entre subprocesos. Utiliza fprintf para escribir realmente el contenido en la consola.

La biblioteca Microsoft C hace algunas afirmaciones que ser compatible con POSIX, por lo que el código en el artículo probablemente es bastante ampliamente portátil (como muchos otros sistemas operativos populares son compatible con POSIX). Pero esto no significa que las transmisiones estándar de C++ sean seguras para subprocesos.

9

Eso sería un detalle específico de la implementación. Puede preguntar si el compilador X con Run Time Library Y tiene flujos estándar seguros para subprocesos, pero no puede preguntar si todas las implementaciones lo hacen, porque las implementaciones pueden diferir con respecto a la seguridad de subprocesos. Esto es parte de lo que significa que C++ no tiene un concepto incorporado de hilos. Es todo específico de la implementación.

+0

Eso también lo creo :) ¡pero el artículo dice que el código también es portátil! – AraK

+2

Supongo que el autor del artículo simplemente dice que funciona en todos los sitios donde lo ha intentado. Probablemente no lo haya probado, digamos, Keil C con HomeGrownRTOS v1.2, o cualquier cantidad de otras combinaciones poco comunes. –

+0

El artículo no está hablando de transmisiones en C++. –

3

Desde el estándar C++ actual ni siquiera reconoce que hay cosas que se llaman "hilos", ciertamente no da ninguna garantía en relación con hilo de seguridad en absoluto.

Todo esto está definido por la implementación.

Cuestiones relacionadas