Domanda

Mi sembra di essere sempre un'eccezione generato solo con un thread creato con Qtconcurrent :: run

Ho una classe denominata FPSengine che ha un metodo denominato FPSengine :: getData () che viene chiamato dal thread principale e altre 3 fili (2 qthreads e 1 fornito con QtConcurrent :: run ()). All'interno FPSengine :: getData () che io chiamo QTIME :: currentTime (). Se chiamo FPSengine :: getData () dal thread principale o una delle qthreads non ho alcun problema, ma quando chiamo FPSengine :: getData () dal thread creato con Qtconcurrent :: run () a volte ottengo un'eccezione. Ci potrebbe essere qualcosa di sbagliato con Qtconcurrent o QTIME: currentTime () o anche tzset (che è chiamato da QTIME :: currentTime da quello che gli spettacoli pila gdb)? O c'è qualcosa di sbagliato con il mio codice. Ecco le informazioni stack del thread in mancanza di:
0 rilancio /lib/libc.so.6 0
1 abortire /lib/libc.so.6 0
2 ?? /lib/libc.so.6 0
3 ?? /lib/libc.so.6 0
4 gratis /lib/libc.so.6 0
5 ?? /lib/libc.so.6 0
6 tzset /lib/libc.so.6 0
7 QTIME :: currentTime () /usr/lib/libQtCore.so.4 0
8 FPSengine :: xmitData FPSengine2.cpp 93
9 FPSengine :: getData FPSengine2.cpp 21
10 threadDatalog :: gestito threaddatalog.cpp 109
11 ?? /usr/lib/libQtCore.so.4 0
12 start_thread /lib/libpthread.so.0 0
13 clone /lib/libc.so.6 0 14 ?? 0

È stato utile?

Soluzione

QTime::currentTime() (o qualsiasi funzione QTime, in realtà) non sono documentati come concorrente. Inoltre, dubito che la chiamata sottostante (tzset) è progettato per gestire la concorrenza molto bene. Di conseguenza, avrete probabilmente bisogno di aggiungere una certa protezione, come ad esempio un mutex, intorno alla chiamata per ottenere il tempo corrente per impedire l'accesso simultaneo. Non so se questo risolverà il problema, ma probabilmente di aiuto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top