исключение, сгенерированное с помощью qtconcurrent и вызовом QTime:currentTime

Кажется, я получаю исключение, сгенерированное только потоком, созданным с помощью Qtconcurrent::run

У меня есть класс с именем FPSengine, в котором есть метод с именем FPSengine::getData(), который вызывается основным потоком и тремя другими потоками (2 QThreads и 1, созданный с помощью QtConcurrent::run()). Внутри FPSengine::getData() я вызываю QTime::currentTime(). Если я вызываю FPSengine::getData() из основного потока или одного из QThreads, у меня нет никаких проблем, но когда я вызываю FPSengine::getData() из потока, созданного с помощью Qtconcurrent::run(), я иногда получаю исключение. Может ли быть что-то не так с Qtconcurrent или QTime:currentTime() или даже с tzset (который вызывается QTime::currentTime из того, что показывает стек gdb)? Или что-то не так с моим кодом. Вот информация о стеке отказавшего потока:
0 поднять /lib/libc.so.6 0
1 abort /lib/libc.so.6 0
2 ?? /lib/libc.so.6 0
3 ?? /lib/libc.so.6 0
4 бесплатно /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::run 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


person yan bellavance    schedule 03.02.2010    source источник


Ответы (1)


QTime::currentTime() (или любая из QTime функций, на самом деле) не задокументированы как параллельные. Кроме того, я сомневаюсь, что базовый вызов (tzset) предназначен для очень хорошей обработки параллелизма. Соответственно, вам, вероятно, потребуется добавить некоторую защиту, например мьютекс, вокруг вызова, чтобы получить текущее время, чтобы предотвратить одновременный доступ. Я не знаю, решит ли это вашу проблему, но, вероятно, поможет.

person Caleb Huitt - cjhuitt    schedule 04.02.2010
comment
спасибо, я смог изменить свой код, чтобы больше не использовать эти вызовы, и проблема исчезла - person yan bellavance; 04.02.2010