Pergunta

Eu vi recentemente à luz do comportamento poderoso do EventWaitHandle em C # e decidiu mudar algumas funcionalidades em uma aplicação irmã a fazer o mesmo. O único problema é que o aplicativo irmã é escrito em C.

Não é grande coisa, eu estou usando pthreads, que têm um tipo de dados pthread_cond_t que permite a sinalização. Minha única pergunta é, é possível para um cond ser 'sinalizado' antes que algo está esperando por ele?

Agora meu teste não diz. Ou seja, se ThreadA dispara um sinal antes ThreadB está esperando, ThreadB vai esperar indefinidamente. Existe outro tipo pthread que eu possa usar que se comporta mais perto da funcionalidade do EventWaitHandle em C #? Um objeto é sinalizado, o que significa que o primeiro segmento para esperar nele, vai passar imediatamente, e configurá-lo para unsignalled.

Envolver o pthread_cond em outra estrutura de dados não seria muito difícil conseguir isso. Mas, novamente, é essa funcionalidade já está disponível na biblioteca pthread?

Foi útil?

Solução

Se você estiver usando variáveis ??de condição corretamente, isso não importa.

O fluxo básico de seu código deve ser (em pseudocódigo):

lock(lockobj);
while (!signalled) {
    wait(condvar);
}
signalled = false;
unlock(lockobj);

no lado esperando, e:

lock(lockobj);
signalled = true;
notify(condvar);
unlock(lockobj);

no lado de sinalização. (Claro, o objeto de bloqueio e variável de condição utilizado tem que ser o mesmo em ambos os lados.) Espero que isso ajude!

Outras dicas

resposta Alternativa (também em pseudocódigo) se quiser várias sinalizações (ou seja, se sinalizou duas vezes, em seguida, dois segmentos podem esperar antes de o estado é unsignalled de novo).

lado de espera:

lock(lockobj);
while (signalled != 0) {
    wait(condvar);
}
--signalled;
unlock(lockobj);

lado de sinalização:

lock(lockobj);
++signalled;
notify(condvar);
unlock(lockobj);

I terminou apenas envolvendo um tipo de condição em uma nova estrutura e criou algumas funções simples para se comportam como o EventWaitHandle de C #. Eu precisava de dois semáforos para acesso serializado adequada acheive.

A do cond_mutex é utilizado para esperando na variável condicional, enquanto o data_mutex é usada quando definir o estado de um sinal para não sinalizado.

O modo de reposição é a mesma de C #. AUTO ou MANUAL. Isto permite a event_wait_t para repor-se automaticamente depois de esperar. Ou deixar o programador fazê-lo manualmente com uma chamada para event_wait_reset (event_wait_t EWH *);

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top