pthread_mutex_t pthread_mutex_lock pthread_mutex_init pthread_cond_init pthread example ejemplo c ubuntu pthreads mutex

pthread_mutex_lock - PTHREAD_MUTEX_INITIALIZER contra pthread_mutex_init(y mutex, param)



pthread_mutex_init example (4)

¿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 uso 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 hilos de trabajo.


En los casos en que los atributos mutex predeterminados son adecuados, la macro PTHREAD_MUTEX_INITIALIZER se puede utilizar para inicializar mutexes.

Si desea especificar atributos para mutex, vaya con la 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 attrspecified como NULL, excepto que no se realizan comprobaciones de error.


En versiones anteriores del estándar POSIX, solo se garantiza que el primer método con un inicializador funcione con variables asignadas estáticamente, no cuando la variable es una variable auto que se define en un cuerpo de función. Aunque nunca he visto una plataforma donde esto no se permita, 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 de arranque mucho más fácil. Siempre que en el tiempo de ejecución ingrese un código que use dicho mutex, puede estar seguro de que el mutex está inicializado. Esta es una información valiosa en el contexto de multi-threading.

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


Me gustaría citar esto de este book :

Con POSIX hilos POSIX , hay dos formas de inicializar los bloqueos. Una forma de hacerlo es usar PTHREAD_MUTEX_INITIALIZER , de la siguiente manera: pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;

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

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


Puede establecer más atributos del mutex con la inicialización dinámica, además de que 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 de malo con el enfoque estático, si eso se ajusta a sus necesidades.