PTHREAD_MUTEX_INITIALIZER frente a pthread_mutex_init (& mutex, param)

91

¿Hay alguna diferencia entre

pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;

O

pthread_mutex_t lock;
pthread_mutex_init ( &lock, NULL);

¿Estoy lo suficientemente seguro si utilizo solo el primer método?

NOTA: Mi pregunta se refiere principalmente a programas muy pequeños donde, como mucho, lo que haré es conectar varios clientes a un servidor y resolver sus consultas con subprocesos de trabajo.

Kalec
fuente

Respuestas:

74

En versiones anteriores del estándar POSIX, el primer método con un inicializador solo está garantizado para trabajar con variables asignadas estáticamente, no cuando la variable es una autovariable definida en el cuerpo de una función. Aunque nunca he visto una plataforma donde esto no esté permitido, incluso para autovariables, y esta restricción se ha eliminado en la última versión del estándar POSIX.

La staticvariante es realmente preferible si se puede, ya que permite escribir código bootstrap mucho más fácilmente. Siempre que, durante el tiempo de ejecución, ingrese un código que utilice dicho mutex, puede estar seguro de que el mutex está inicializado. Esta es una información valiosa en un contexto de subprocesos múltiples.

El método que usa una función init es preferible cuando necesita propiedades especiales para su mutex, como ser recursivo, por ejemplo, o ser compartible entre procesos, no solo entre subprocesos.

Jens Gustedt
fuente
8

Puede establecer más atributos del mutex con la inicialización dinámica, además, solo puede usar el método dinámico si está agregando un montón de mutex en tiempo de ejecución.

Sin embargo, no hay nada de malo en el enfoque estático, si se ajusta a sus necesidades.

Joe
fuente
" Además, solo puede usar el método dinámico si está agregando un montón de mutexes en tiempo de ejecución " . Entonces, ¿qué significa esto? ¿Un pequeño ejemplo si no es fácil de explicar?
Kalec
1
@Kalec: si su mutex está asignado por malloc()(o pertenece a un objeto que está asignado).
Michael Burr
3
@Kalec si la variable mutex "lock" es parte de una estructura, entonces no podemos seguir el primer enfoque. tenemos que usar pthread_init ().
pankaj kushwaha
8

Me gustaría citar esto de este libro :

Con POSIXsubprocesos, hay dos formas de inicializar bloqueos. Una forma de hacer esto es usar PTHREAD_MUTEX_INITIALIZER, de la siguiente manera: pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;

Al hacerlo, el bloqueo se establece en los valores predeterminados y, por lo tanto, se puede utilizar el bloqueo. La forma dinámica de hacerlo (es decir, en tiempo de ejecución) es realizar una llamada a de la pthread_mutex_init()siguiente manera: int rc = pthread_mutex_init(&lock, NULL); assert(rc == 0); // always check success!

El primer argumento de esta rutina es la dirección del bloqueo en sí, mientras que el segundo es un conjunto opcional de atributos. Lea más sobre los atributos usted mismo; pasar NULL en simplemente usa los valores predeterminados. De cualquier manera funciona , pero generalmente usamos el método dinámico (último).

Mari202
fuente
5

En los casos en los que los atributos de exclusión mutua predeterminados son apropiados, la macro PTHREAD_MUTEX_INITIALIZER se puede utilizar para inicializar las exclusiones mutuas.

Si desea especificar atributos para mutex, vaya con inicialización dinámica ........

El efecto será equivalente a la inicialización dinámica mediante una llamada a pthread_mutex_init () con el parámetro attr especificado como NULL, excepto que no se realizan comprobaciones de errores.

Ramesh Miriyala
fuente