Sono in esecuzione un programma multithreaded presa con valgrind. Il client invierà una richiesta al server su TCP e quindi occuperà l'attesa su un valore booleano. Il valore booleano verrà impostato quando viene richiamata la funzione di callback che fornisce la risposta dal server. Una volta ricevuta la risposta (e il flag booleano è impostato), il server invierà nuovamente una richiesta e lo farà ripetutamente in un ciclo.bancarelle valgrind in programma presa multithreading
Mi rendo conto che l'accesso non sincronizzato a variabili condivise (il booleano) può causare problemi di threading, ma ho provato a utilizzare i mutex pthread e il programma rallenta di circa il 20% (la velocità è importante qui). Sono fiducioso che scrivere sulla variabile booleana condivisa va bene dato che può essere fatto in un singolo ciclo.
Il programma funziona bene al di fuori di valgrind, ma sarà spesso in stallo se eseguito con valgrind. Ho lasciato il programma in esecuzione durante la notte .. di solito ci vogliono alcuni secondi per completare, quindi non penso che sia un caso di non aspettare abbastanza a lungo per il completamento del programma. Il threading è gestito dal framework del motore open source (quick fix), quindi non penso che sia un problema con il modo in cui i thread sono creati/gestiti.
Qualcuno sa di eventuali problemi con valgrind intorno multi threaded programmi/cicli di attesa occupato/Socket Communications (o una combinazione di questi)?
busy-waiting su una variabile booleana condivisa non è "eseguito in un singolo ciclo", è eseguito in più cicli per iterazione del ciclo e se il ciclo di occupato è in attesa su un round-trip TCP attraverso la rete, quindi il il ciclo probabilmente andrà a ripetersi diversi miliardi di volte (e quindi sprecherà diversi miliardi di cicli di CPU che potrebbero essere stati usati meglio altrove). Una soluzione migliore di entrambe le cose che hai menzionato sarebbe quella di attendere su una variabile di condizione, e fare in modo che la funzione di callback segnali la variabile di condizione per riattivare il thread quando i dati sono pronti. –
Stavo affermando che la scrittura sulla variabile booleana viene eseguita in un singolo ciclo (non l'intero processo di attesa occupato). Detto questo, avrei dovuto dichiarare che scrivere sulla variabile booleana è fatto atomicamente (dato che la cache non riesce, ecc., Può spingere una scrittura di un singolo byte dopo un singolo ciclo della CPU) – Taras
Quello che ha detto Jeremy: l'attesa di lavoro è una cattiva idea, variabile di condizione è meglio, ed è improbabile che sia più lento ... – BillT