исключение, сгенерированное с помощью qtconcurrent и вызывающее QTime: currentTime - PullRequest
0 голосов
/ 04 февраля 2010

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

У меня есть класс с именем FPSengine, у которого есть метод с именем FPSengine :: getData (), который вызывается основным потоком и 3 другими потоками (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 отмена /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 клонов /lib/libc.so.6 0 14 ?? 0

1 Ответ

1 голос
/ 04 февраля 2010

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

...