Questão de Sistemas Operacionais — Threads (SO) — FUNDATEC 2023
Sistemas Operacionais›Threads (SO)
Código
qa541342
Banca
FUNDATEC
Órgão
IFC
Ano
2023
Cargo
PEBTT ( )
Considerando um programa concorrente com múltiplas threads, analise as seguintes assertivas sobre o uso de travas, também conhecidas como mutex:
I. Uma trava pode ser usada para proteger a memória de acesso simultâneo por múltiplas threads, mas não pode impedir threads do mesmo processo de acessar o mesmo arquivo.
II. Usar uma trava evita que múltiplas threads leiam da e escrevam na mesma variável dentro do escopo da trava ao mesmo tempo, o que causaria resultados inconsistentes ou incorretos.
III. Caso o programador não use travas, o sistema operacional sincroniza as threads automaticamente, mas com uma perda de eficiência.
Quais estão corretas?
AApenas I.
BApenas II.
CApenas III.
DApenas I e II.
EApenas II e III.
Revelar gabarito e comentário▾
GabaritoB — Apenas II.
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”.
Travas (mutex) em programas concorrentes
Gabarito: letra B — apenas a assertiva II está correta. Uma trava (mutex) é um mecanismo de sincronização que garante exclusão mútua: apenas uma thread por vez pode executar o trecho de código protegido (a região crítica), impedindo que múltiplas threads leiam e escrevam na mesma variável simultaneamente, o que causaria resultados inconsistentes. As assertivas I e III estão incorretas: travas podem sim proteger o acesso a arquivos (além da memória), e o sistema operacional não sincroniza threads automaticamente — sem travas, há corrida (race condition).
Uma trava, também chamada de mutex (do inglês mutual exclusion), é uma primitiva de sincronização usada para proteger uma região crítica — o trecho de código que acessa um recurso compartilhado (variável, estrutura de dados, arquivo, etc.). Quando uma thread "tranca" o mutex, nenhuma outra thread pode entrar naquela região até que a primeira a "destrave". Isso garante que operações de leitura e escrita sobre o mesmo dado sejam atômicas do ponto de vista das threads concorrentes, evitando o problema clássico de corrida (race condition), em que o resultado final depende da ordem imprevisível de execução das threads.
O conceito central é o de exclusão mútua: se duas threads executam x = x + 1 ao mesmo tempo sem trava, ambas podem ler o mesmo valor antigo de x, incrementar e escrever de volta, resultando em apenas um incremento em vez de dois — um resultado incorreto. A trava serializa o acesso: uma thread entra, executa a operação completa e só então libera para a próxima. É exatamente isso que a assertiva II descreve corretamente.
É importante distinguir trava de outros mecanismos de sincronização. O semáforo é uma generalização do mutex: possui um contador que permite controlar o acesso a um número limitado de recursos idênticos (não apenas 0 ou 1). O mutex é um caso especial de semáforo binário, mas com uma diferença importante: o mutex tem o conceito de dono — apenas a thread que o trancou pode destravá-lo —, enquanto o semáforo pode ser sinalizado por qualquer thread. Já as variáveis de condição são usadas em conjunto com mutexes para permitir que uma thread espere por uma condição específica (ex.: buffer cheio/vazio), bloqueando-se até ser notificada.
A banca explora aqui uma confusão comum: achar que o sistema operacional resolve a sincronização automaticamente. Isso é falso — a sincronização é responsabilidade do programador, que deve usar travas, semáforos ou monitores explicitamente. Sem isso, o SO apenas escala as threads de forma independente, e o acesso concorrente a dados compartilhados fica sujeito a corridas. Outra confusão frequente é achar que travas servem apenas para memória; elas também são usadas para proteger o acesso a arquivos (travas de arquivo, exclusivas ou compartilhadas), como veremos na assertiva I.
Guarde o critério decisivo: trava = exclusão mútua sobre um recurso compartilhado, imposta pelo programador. É com essa régua que vamos julgar cada assertiva.
Trava (mutex): Função (Exclusão mútua, Protege região crítica, Evita race condition); Recursos protegidos (Memória (variáveis), Arquivos (file locks)); Responsabilidade (Programador, SO não sincroniza sozinho); Distinções (Semáforo (contador, sem dono), Mutex (binário, com dono), Variável de condição (espera))
Item I — ❌ Incorreto
A assertiva afirma que uma trava "pode proteger a memória de acesso simultâneo, mas não pode impedir threads do mesmo processo de acessar o mesmo arquivo". A primeira parte está correta, mas a segunda é falsa: travas podem sim ser usadas para proteger o acesso a arquivos. Sistemas operacionais oferecem travas de arquivo (file locks), que podem ser exclusivas (apenas um processo/thread acessa) ou compartilhadas (vários leitores, um escritor). O erro está na palavra "não pode" — a trava é um mecanismo genérico de exclusão mútua aplicável a qualquer recurso compartilhado, incluindo arquivos.
Item II — ✅ Correto
Esta assertiva descreve com precisão a função de uma trava: "evita que múltiplas threads leiam da e escrevam na mesma variável dentro do escopo da trava ao mesmo tempo, o que causaria resultados inconsistentes ou incorretos". É exatamente a definição de exclusão mútua: dentro da região crítica protegida pela trava, apenas uma thread por vez opera sobre o dado compartilhado, garantindo consistência. Sem isso, leituras e escritas concorrentes produzem resultados imprevisíveis (race condition).
Item III — ❌ Incorreto
A assertiva afirma que "caso o programador não use travas, o sistema operacional sincroniza as threads automaticamente, mas com uma perda de eficiência". Isso é falso em dois pontos: (1) o SO não sincroniza threads automaticamente — a sincronização é responsabilidade do programador, que deve usar travas, semáforos ou monitores; (2) sem travas não há "perda de eficiência", há corrupção de dados (resultados incorretos). A perda de eficiência ocorre justamente com o uso de travas, pois elas serializam o acesso e podem causar contenção. A banca inverteu completamente o sentido: sem sincronização, o problema não é desempenho, é corretude.
Conclusão: apenas o item II está correto. Portanto, o gabarito é a letra B.