PTHREAD_MUTEX_INITIALIZER vs pthread_mutex_init (& mutex, param)

89

Existe alguma diferença entre

pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;

Ou

pthread_mutex_t lock;
pthread_mutex_init ( &lock, NULL);

Estou seguro o suficiente se usar apenas o primeiro método?

NOTA: Minha pergunta se refere principalmente a programas muito pequenos onde, no máximo, o que farei é conectar vários clientes a um servidor e resolver suas dúvidas com threads de trabalho.

Kalec
fonte

Respostas:

72

Por versões mais antigas do padrão POSIX, o primeiro método com um inicializador só funciona com variáveis ​​alocadas estaticamente, não quando a variável é uma autovariável definida em um corpo de função. Embora eu nunca tenha visto uma plataforma onde isso não seria permitido, mesmo para autovariáveis, e essa restrição foi removida na versão mais recente do padrão POSIX.

A staticvariante é realmente preferível se você puder, uma vez que permite escrever código de bootstrap muito mais facilmente. Sempre que, em tempo de execução, você inserir um código que usa esse mutex, pode ter certeza de que o mutex foi inicializado. Esta é uma informação preciosa no contexto de multi-threading.

O método usando uma função init é preferível quando você precisa de propriedades especiais para seu mutex, como ser recursivo, por exemplo, ou ser compartilhável entre processos, não apenas entre threads.

Jens Gustedt
fonte
8

Você pode definir mais atributos do mutex com a inicialização dinâmica, além disso, você só pode usar o método dinâmico se estiver adicionando um monte de mutexes em tempo de execução.

Porém, não há nada de errado com a abordagem estática, se ela atender às suas necessidades.

Joe
fonte
Além disso, você só pode usar o método dinâmico se estiver adicionando um monte de mutexes em tempo de execução. ” Então, o que isso significa? Um pequeno exemplo se não for fácil de explicar?
Kalec
1
@Kalec: se seu mutex for alocado por malloc()(ou pertencer a um objeto alocado).
Michael Burr
3
@Kalec se a variável mutex "lock" faz parte de uma estrutura, então não podemos seguir a primeira abordagem. temos que usar pthread_init ().
pankaj kushwaha
7

Eu gostaria de citar este livro :

Com POSIXthreads, existem duas maneiras de inicializar bloqueios. Uma maneira de fazer isso é usar o PTHREAD_MUTEX_INITIALIZERseguinte: pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;

Isso define o bloqueio para os valores padrão e, portanto, torna o bloqueio utilizável. A maneira dinâmica de fazer isso (ou seja, em tempo de execução) é fazer uma chamada para pthread_mutex_init()o seguinte: int rc = pthread_mutex_init(&lock, NULL); assert(rc == 0); // always check success!

O primeiro argumento para essa rotina é o endereço do próprio bloqueio, enquanto o segundo é um conjunto opcional de atributos. Leia mais sobre os atributos você mesmo; passar NULL simplesmente usa os padrões. Qualquer uma das formas funciona , mas geralmente usamos o método dinâmico (último).

Mari202
fonte
4

Nos casos em que os atributos mutex padrão são apropriados, a macro PTHREAD_MUTEX_INITIALIZER pode ser usada para inicializar mutexes.

Se você deseja especificar atributos para mutex vá com inicialização dinâmica ........

O efeito deve obrigatoriamente ser equivalente à inicialização dinâmica por uma chamada a pthread_mutex_init () com o parâmetro Attrspecified como NULL, exceto que nenhuma verificação de erro é realizada.

Ramesh Miriyala
fonte