PTHREAD MUTEX INITIALIZER vs pthread mutex init (&mutex, param)


¿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 a lo sumo lo que haré es conectar varios clientes a un servidor y resolver sus consultas con hilos de trabajo.

Author: Kalec, 2013-01-14

4 answers

Por 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 variable auto que está definida en un cuerpo de función. Aunque nunca he visto una plataforma donde esto no estuviera permitido, incluso para variables auto, y esta restricción se ha eliminado en la última versión del estándar POSIX.

La variante static es realmente preferible si se puede, ya que permite escribir código bootstrap mucho más fácil. Siempre que en tiempo de ejecución ingrese código que use un mutex de este tipo, puede estar seguro de que el mutex se inicializa. Esta es una información preciosa en el contexto de multi-threading.

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.

 57
Author: Jens Gustedt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-11-06 21:09:48

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 mutexes en tiempo de ejecución.

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

 6
Author: Joe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-01-14 14:16:37

En los casos donde los atributos mutex predeterminados son apropiados, la macro PTHREAD_MUTEX_INITIALIZER se puede usar para inicializar mutexes.

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

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

 2
Author: rameshandroid99,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-11-29 06:29:46

Me gustaría citar esto de este libro :

Con POSIX hilos, hay dos formas de inicializar bloqueos. Ida para hacer esto es usar PTHREAD_MUTEX_INITIALIZER, de la siguiente manera: pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;

Al hacerlo, se establece el bloqueo en los valores predeterminados y, por lo tanto, el bloqueo utilizable. La forma dinámica de hacerlo (es decir, en tiempo de ejecución) es hacer una llamada a pthread_mutex_init() de la 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. Leer más sobre los atributos usted mismo; pasar NULL simplemente usa los valores predeterminados. De cualquier manera funciona, pero solemos usar el método dinámico (último).

 1
Author: Mari202,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-08 21:01:46