0

Qtconcurrent::runで作成されたスレッドでのみ例外が生成されているようです

メインスレッドと他の3つのスレッド(2つのQThreadsと1つはQtConcurrent :: run()で作成)によって呼び出されるFPSengine :: getData()という名前のメソッドを持つFPSengineという名前のクラスがあります。FPSengine :: getData()の内部でQTime :: currentTime()を呼び出します。メインスレッドまたはQThreadsの1つからFPSengine::getData()を呼び出すと問題は発生しませんが、Qtconcurrent :: run()で作成されたスレッドからFPSengine :: getData()を呼び出すと例外が発生することがあります。QtconcurrentまたはQTime:currentTime()、あるいはtzset(gdbスタックが示すものからQTime :: currentTimeによって呼び出される)に何か問題がありますか?または、私のコードに何か問題がありますか。失敗したスレッドのスタック情報は次のとおりです
。0raise /lib/libc.so.60
1 abort /lib/libc.so.6 0
2 ?? /lib/libc.so.6 0
3 ?? /lib/libc.so.604
無料/lib/libc.so.605
?? /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

4

1 に答える 1

1

QTime::currentTime()(またはQTime実際にはいずれかの機能)は、並行として文書化されていません。また、基になる呼び出し(tzset)が並行性を非常にうまく処理するように設計されているとは思えません。したがって、同時アクセスを防ぐために現在の時刻を取得するには、コールの周囲にミューテックスなどの保護を追加する必要があります。これで問題が解決するかどうかはわかりませんが、おそらく役立つでしょう。

于 2010-02-04T18:29:16.923 に答える