Pular para o conteúdo principal

Questão de Sistemas Operacionais — Threads — CESPE / CEBRASPE 2024

Sistemas OperacionaisThreads
Código
ce190528
Banca
CESPE / CEBRASPE
Órgão
TSE
Ano
2024
Nível
Superior
Cargo
Analista Judiciário – Área: Apoio Especializado – Especialidade: Tecnologia da Informação
Captura_de tela 2024-12-17 082810.png 430×445Com base no trecho de código precedente, escrito em Rust, que cria um contador, julgue o item a seguir.A instrução let counter = Arc::new(0); combina exclusão mútua com contagem atômica de referência e garante acesso seguro e exclusivo a dados entre threads.
  1. CCerto
  2. EErrado
Revelar gabarito e comentário

GabaritoE — Errado

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”.

Arc<T> em Rust: contagem atômica de referência, não exclusão mútua

Gabarito: ERRADO. A instrução let counter = Arc::new(0); cria um contador atômico de referência (Arc = Atomic Reference Counting), que permite que múltiplas threads compartilhem o mesmo valor com segurança, mas não fornece exclusão mútua — o Arc apenas garante que a contagem de referências seja atômica, não que o acesso ao dado interno seja exclusivo. Para exclusão mútua, seria necessário combinar o Arc com um Mutex (ou RwLock), como em Arc<Mutex<i32>>.

O Arc<T> é um tipo de ponteiro inteligente da biblioteca padrão do Rust projetado para compartilhamento de dados entre threads. A palavra "atômico" em seu nome refere-se exclusivamente à contagem de referências — o mecanismo que rastreia quantos ponteiros apontam para o mesmo dado e que permite a liberação automática da memória quando o último ponteiro é destruído. Essa contagem é feita de forma atômica (ou seja, segura contra corridas de dados), mas o dado em si (T) permanece imutável e acessível a todas as threads que possuem um clone do Arc. Não há nenhum mecanismo de bloqueio ou exclusão mútua embutido no Arc.

Para entender a distinção, é útil comparar os principais tipos de sincronização do Rust:

Tipo

Função principal

Exclusão mútua?

Uso típico

Arc<T>

Compartilhamento de dados imutáveis entre threads

Não

Dados de leitura compartilhados

Mutex<T>

Exclusão mútua com bloqueio

Sim

Dados mutáveis acessados por uma thread por vez

RwLock<T>

Leitura concorrente / escrita exclusiva

Sim (na escrita)

Dados com mais leituras que escritas

AtomicUsize

Operações atômicas em inteiros

Não (mas operações indivisíveis)

Contadores, flags

Na prática, quando se deseja um contador compartilhado e mutável entre threads, a combinação correta seria Arc<AtomicUsize> (para operações atômicas de incremento/decremento) ou Arc<Mutex<i32>> (para exclusão mútua com um inteiro comum). O código Arc::new(0) cria um Arc apontando para um inteiro imutável 0 — qualquer tentativa de modificá-lo exigiria um tipo com mutabilidade interior, como Mutex ou AtomicUsize.

A pegadinha da banca está em atribuir ao Arc uma propriedade que ele não possui: a exclusão mútua. O candidato que conhece apenas o nome "atômico" pode ser induzido a pensar que o Arc oferece acesso exclusivo, mas o termo "atômico" qualifica apenas a contagem de referências, não o acesso ao dado. É uma confusão clássica entre dois conceitos distintos de concorrência: compartilhamento seguro (que o Arc fornece) e exclusão mútua (que exige Mutex ou similar).

NÃO CAIA NESSA!

A banca explora a ambiguidade do termo "atômico" no nome Arc. O candidato pode pensar que "atômico" significa "acesso exclusivo", mas na verdade refere-se apenas à contagem de referências. O Arc garante que o dado seja compartilhado com segurança (sem corridas na contagem de referências), mas não impede que múltiplas threads acessem o dado simultaneamente. Para exclusão mútua, seria necessário Arc<Mutex<T>>.

Item — ❌ ERRADO

A afirmação de que Arc::new(0) "combina exclusão mútua com contagem atômica de referência" é incorreta por dois motivos:

  1. O Arc não fornece exclusão mútua. Ele é apenas um ponteiro inteligente com contagem atômica de referências. O dado interno (0, um inteiro) permanece imutável e pode ser lido por múltiplas threads simultaneamente, sem qualquer bloqueio.

  2. A exclusão mútua exigiria um tipo adicional. Para acesso exclusivo a um dado mutável, seria necessário Arc<Mutex<i32>> ou Arc<RwLock<i32>>. O Arc sozinho não oferece nenhum mecanismo de bloqueio.

O que o Arc realmente garante é o compartilhamento seguro do dado entre threads: a contagem de referências é atômica, evitando corridas de dados quando o ponteiro é clonado e destruído. Mas o acesso ao dado em si não é exclusivo — é apenas imutável (a menos que se use mutabilidade interior).

Gabarito: ERRADO — o Arc fornece contagem atômica de referência, mas não exclusão mútua.

Link permanente: /questoes/ce190528