Sono nello same situation as this guy, ma non capisco la risposta.Come si "disimpegna" da "accept" su un socket di blocco quando viene segnalato da un altro thread?
Il problema:
- filettatura 1 chiamate
accept
su un socket, che blocca. - Thread 2 chiama
close
su questa presa. - Il thread 1 continua a bloccare. Voglio che ritorni da accettare.
La soluzione:
cosa si dovrebbe fare è inviare un segnale al thread che è bloccato in accettare. Ciò gli darà EINTR e può essere disinnestato in modo pulito - e quindi chiudere il socket. Non chiuderlo da un filo diverso da quello che lo utilizza.
Non capisco cosa fare qui - quando il segnale viene ricevuto in Thread 1, accept
è già il blocco, e continuerà a bloccare dopo che il gestore di segnale è terminato.
- Che cosa significa veramente la risposta che dovrei fare?
- Se il gestore di segnale Thread 1 può eseguire un'operazione che causerà il ritorno immediato di
accept
, perché Thread 2 non può fare lo stesso senza i segnali? - C'è un altro modo per farlo senza segnali? Non voglio aumentare le avvertenze sulla libreria.
Quindi se qualche segnale viene inviato al thread, restituisce? C'è un segnale non operativo per questo genere di cose? – spraff
Credo di si. Il tipo di segnale effettivo influisce sull'azione del gestore, ma molte chiamate di sistema di blocco si interromperanno per darti l'opportunità di fare esattamente quello che stai cercando di fare. Imposta il tuo gestore di segnale per catturare un segnale specifico e inviarlo dal thread di controllo. Il tuo gestore non ha bisogno di fare nulla in particolare. SIGINFO potrebbe non essere una cattiva scelta. È abbastanza benigno. –
Sembra contraddire il consiglio [qui] (http://stackoverflow.com/questions/14613409/are-stdsignal-and-stdraise-thread-safe) ... qualche idea? – spraff