Pular para o conteúdo principal

Questão de Sistemas Operacionais — Threads — FUNDATEC 2026

Sistemas OperacionaisThreads
Código
qg686025
Banca
FUNDATEC
Órgão
IFC-SC
Ano
2026
Nível
Superior
Cargo
Professor EBTT - Informática: Programação de Sistemas
Analise o seguinte programa escrito em linguagem C, executado em ambiente Linux e utilizando a biblioteca POSIX Threads (pthreads):Imagem associada para resolução da questãoConsiderando a execução concorrente das threads, assinale a alternativa correta.
  1. AO uso de pthread_mutex_lock impede automaticamente a ocorrência de deadlock.
  2. BO programa apresenta erro de compilação devido ao uso simultâneo de dois mutex.
  3. CO programa executará sempre na mesma ordem, primeiro thread1 e depois thread2.
  4. DO programa sempre executará corretamente, pois cada thread libera os mutex ao final.
  5. EO programa pode entrar em deadlock, caso cada thread adquira um mutex diferente e aguarde indefinidamente pelo outro.
Revelar gabarito e comentário

GabaritoE — O programa pode entrar em deadlock, caso cada thread adquira um mutex diferente e aguarde indefinidamente pelo outro.

Comentário gerado por IA. É um apoio ao estudo, ancorado em fontes, mas pode conter imprecisões — confira sempre na fonte oficial (lei, súmula, edital e gabarito da banca). Encontrou um erro? Use “Reportar”.

Deadlock em programas com múltiplos mutex (pthreads)

Gabarito: letra E. O programa pode entrar em deadlock caso cada thread adquira um mutex diferente e fique aguardando indefinidamente pelo outro, configurando a espera circular característica do deadlock. A alternativa correta descreve exatamente o cenário clássico de deadlock com dois mutex, que pode ocorrer mesmo com o uso correto das primitivas de sincronização da biblioteca POSIX Threads.

O deadlock é uma condição em que duas ou mais threads (ou processos) ficam permanentemente bloqueadas, cada uma esperando por um recurso que a outra detém. Para que o deadlock ocorra, quatro condições devem ser satisfeitas simultaneamente: exclusão mútua (cada recurso só pode ser usado por uma thread por vez), posse e espera (uma thread detém um recurso e espera por outro), não preempção (os recursos não podem ser retirados à força) e espera circular (existe um ciclo de threads, cada uma esperando por um recurso detido pela próxima). No programa da questão, há dois mutex (vamos chamá-los de mutex A e mutex B) e duas threads (thread1 e thread2). Se a thread1 adquirir o mutex A e, antes de liberá-lo, tentar adquirir o mutex B, enquanto a thread2 adquiriu o mutex B e tenta adquirir o mutex A, temos exatamente a espera circular: thread1 espera por B (detido por thread2) e thread2 espera por A (detido por thread1). Nenhuma das duas consegue progredir, e o programa fica travado para sempre.

É importante destacar que o uso de mutex é uma técnica de sincronização para evitar condições de corrida (acesso concorrente a dados compartilhados), mas não previne deadlock por si só. Pelo contrário, o uso inadequado de múltiplos mutex é uma das causas mais comuns de deadlock. Para evitá-lo, uma estratégia é estabelecer uma ordem global de aquisição dos mutex (por exemplo, sempre adquirir o mutex A antes do B), garantindo que não haja ciclo. Outra abordagem é usar pthread_mutex_trylock para tentar adquirir o mutex sem bloquear e, se falhar, liberar os já adquiridos e tentar novamente.

A banca explora exatamente a confusão entre sincronização (mutex) e prevenção de deadlock. O candidato pode pensar que, como cada thread libera os mutex ao final, o programa sempre executará corretamente — mas isso ignora a possibilidade de as threads ficarem bloqueadas antes de chegar ao final. A alternativa E captura precisamente essa possibilidade, descrevendo o cenário de deadlock com dois mutex.

Guarde a distinção: mutex garante exclusão mútua, mas não garante ausência de deadlock. É nessa fronteira que as alternativas se dividem.

1Condições (4 simultâneas)
Exclusão mútua
Posse e espera
Não preempção
Espera circular
2Cenário clássico (2 mutex)
Thread 1 detém A, espera B
Thread 2 detém B, espera A
Nenhuma progride
3Prevenção
Ordem global de aquisição
pthread_mutex_trylock
4Mutex
Garante exclusão mútua
Não previne deadlock
Deadlock
LEVELsoulevel.com.br
Deadlock: Condições (4 simultâneas) (Exclusão mútua, Posse e espera, Não preempção, Espera circular); Cenário clássico (2 mutex) (Thread 1 detém A, espera B, Thread 2 detém B, espera A, Nenhuma progride); Prevenção (Ordem global de aquisição, pthread_mutex_trylock); Mutex (Garante exclusão mútua, Não previne deadlock)

Alternativa A — ❌ Incorreta

Afirma que pthread_mutex_lock impede automaticamente a ocorrência de deadlock. Isso é falso: o mutex é uma primitiva de exclusão mútua, mas o deadlock pode ocorrer justamente pelo uso inadequado de múltiplos mutex, como no cenário da questão. O mutex não tem mecanismo para detectar ou evitar espera circular.

Alternativa B — ❌ Incorreta

Afirma que o programa apresenta erro de compilação devido ao uso simultâneo de dois mutex. Não há erro de compilação: a biblioteca pthreads permite declarar e usar múltiplos mutex normalmente. O problema é de execução (deadlock), não de compilação.

Alternativa C — ❌ Incorreta

Afirma que o programa executará sempre na mesma ordem, primeiro thread1 e depois thread2. A ordem de execução das threads é determinada pelo escalonador do sistema operacional e não é previsível. As threads podem executar em qualquer ordem, e é justamente essa imprevisibilidade que pode levar ao deadlock.

Alternativa D — ❌ Incorreta

Afirma que o programa sempre executará corretamente, pois cada thread libera os mutex ao final. Isso ignora a possibilidade de deadlock: se as threads ficarem bloqueadas esperando uma pela outra, nunca chegarão ao final para liberar os mutex. A liberação ao final só ocorre se a execução chegar até lá, o que não é garantido.

Alternativa E — ✅ Correta ⟵ GABARITO

Descreve exatamente o cenário de deadlock: cada thread adquire um mutex diferente e fica aguardando indefinidamente pelo outro. Isso configura a espera circular, uma das quatro condições necessárias para o deadlock. A alternativa está correta porque reconhece que o programa pode entrar em deadlock, dependendo da ordem de execução das threads.

NÃO CAIA NESSA!

A banca troca o conceito de sincronização (mutex) pelo de prevenção de deadlock. O candidato pode pensar que, como cada thread libera os mutex ao final, o programa sempre funcionará — mas o deadlock ocorre antes de chegar ao final. Lembre-se: mutex garante exclusão mútua, não ausência de deadlock.

PEGA ESSA DICA!

Para identificar deadlock em questões de concursos, verifique se há espera circular: cada thread detém um recurso e espera por outro detido por outra thread. Se houver um ciclo, há risco de deadlock. Uma forma de evitar é estabelecer uma ordem global de aquisição dos mutex.

Gabarito: letra E

Link permanente: /questoes/qg686025