Come segnalare un ciclo per continuare l'esecuzione invece di usare il sonno

4

Sto cercando di creare un thread che siederà e attenderà il rilevamento di nuovi oggetti in vector (la coda). L'uso di un ciclo distrugge le risorse sulla macchina data, quindi sto cercando di capire come posso creare un thread di blocco che aspetta una notifica dal thread principale.

L'applicazione attenderà essenzialmente nuovi oggetti in vector e eseguirà alcune pesanti operazioni di I / O - lettura di file di grandi dimensioni, compressione e scrittura su disco.

    
posta user0000001 18.06.2016 - 08:39
fonte

1 risposta

6

(Non sono sicuro di capire cosa vuoi, sto cercando di indovinare: IO asincrono potrebbe significare aio (7) ma non parlerai di thread per eseguirli, tuttavia suppongo che tu sia su Linux - adattare la mia risposta ad altri sistemi operativi

Potresti considerare l'utilizzo di variabili di condizione utilizzando std::condition_variable con std :: mutex (probabilmente qualche altro thread segnalerebbe la variabile di condizione, ad esempio quando si aggiunge alla coda). Se non hai familiarità con i concetti, vedi questo tutorial di pthread (quindi adatta le idee a C ++ 11 discussioni ).

Su sistemi POSIX come Linux, puoi verificare che un set di descrittori di file sia leggibile o scrivibile usando sondaggio (2) , ecc. in alcuni ciclo degli eventi ; vedi anche questo ; e puoi attentamente usare SIGIO (vedi signal (7) e signal-safety (7) prima ...; attenzione che puoi solo richiamare funzioni di sicurezza del segnale asincrono dai gestori di segnali - che esclude la maggior parte delle librerie standard C ++ o C; in pratica puoi tranquillamente impostare alcuni% di% di bandiera al suo interno e testarli bandiere altrove, ad esempio nel ciclo degli eventi). E potresti anche impostare alcuni pipe (7) per auto-in fase di inizializzazione del programma, e scrivi (2) ad esso da un gestore di segnale (a proposito, questo trucco è raccomandato da Qt, in Chiamare le funzioni Qt dai gestori di segnale Unix ), o all'interno di una sezione critica mutex.

PS. Non confondere i segnali Unix con segnalando o trasmettendo una variabile di condizione (che non puoi fare in modo affidabile da dentro un Unix signal (7) gestore).

    
risposta data 18.06.2016 - 08:49
fonte

Leggi altre domande sui tag