Quero esperar uma vez pelos resultados de vários outros threads. A std::latch
seria uma construção adequada - a de espera usa wait()
o produtor count_down()
, mas quero poder definir um tempo limite, então preciso da funcionalidade wait_for . Infelizmente std::latch
não tem wait_for . Bem std::semaphore
, tem, mas geralmente std::semaphore
é usado em lógica inversa. Seria adequado se eu pudesse usar um valor de inicialização negativo, mas mesmo que seja um tipo assinado ( ptrdiff_t
) não é permitido - pré-condição: desejado >= 0.
std::atomic wait()
- poderia resolver todas as tarefas de sincronização, mas... sem wait_for . Parece que preciso construir meu próprio latch com std::condition_variable e std::mutex.
Mas eu gostaria de entender por que algumas construções oferecem funcionalidade de tempo limite (semáforo, mutex, condicional) e outras (trava, barreira, espera atômica) não - há uma razão ou é só porque sim?
Editar Parece que não sou o único que gosta de ter operações temporizadas em atomics: APIs de espera temporizada (try_wait, wait_for e wait_until) para std::atomic são propostas em P2643, visando C++26. ( stack overflow / C++20: Como esperar por um objeto atômico com tempo limite?
O uso interprocessual (memória compartilhada) de atomic-wait seria um sonho real ;-)
O motivo pelo qual
std::latch
estd::barrier
não incluem umwait_for
método se resume principalmente ao seu design e propósito. Essas ferramentas são destinadas a manter a sincronização de threads simples. Astd::latch
é apenas um ponto de verificação único, e astd::barrier
funciona em várias fases. Adicionar timeouts os tornaria mais complicados, o que vai contra seu design mínimo e direto.Diferentemente de coisas como
std::condition_variable
oustd::semaphore
, que dependem de certas condições sendo atendidas (e podem nunca acontecer),std::latch
estd::barrier
são mais baseadas em estado. Elas assumem que todas as threads eventualmente chegarão, então há menos necessidade de timeouts. Se você pensar sobre isso, timeouts são super úteis para evitar coisas como deadlocks, mas com essas construções, é meio que assumido que você já está gerenciando as threads corretamente para evitar esse problema.Se você precisar de algo como um latch, mas com um timeout, você pode construir um você mesmo usando ferramentas como
std::mutex
estd::condition_variable
. Por exemplo, você pode escrever umaTimedLatch
classe simples que permite que você espere por um número definido de threads, mas também desista se demorar muito. É um pouco de trabalho extra, mas lhe dá flexibilidade extra quando você precisa.