2016-09-24 6 views
1

응용 프로그램을 디버깅합니다. 이상한 경쟁 조건이 코드에서 발생하지 않은 것 같습니다. 다음 코드로 테스트하기 Helgrind는 몇 초 내에 잠재적 인 경쟁 조건이 5000 개가 넘는 보고서를 보냅니다. 여기QThread : 가장 단순한 코드로 경쟁 조건

#include <QApplication> 
#include <QThread> 

int main(int argc, char *argv[]) { 
    QApplication app(argc, argv); 

    QThread thread; 
    thread.start(); 

    return app.exec(); 
} 

hellgrind 보고서의 초기 부분 : 다음은 코드

==9856== Helgrind, a thread error detector 
==9856== Copyright (C) 2007-2015, and GNU GPL'd, by OpenWorks LLP et al. 
==9856== Using Valgrind-3.11.0 and LibVEX; rerun with -h for copyright info 
==9856== Command: /home/gianks/NetBeansProjects/ThreadTest/dist/Debug/GNU-Linux/ThreadTest 
==9856== 
==9856== ---Thread-Announcement------------------------------------------ 
==9856== 
==9856== Thread #1 is the program's root thread 
==9856== 
==9856== ---Thread-Announcement------------------------------------------ 
==9856== 
==9856== Thread #2 was created 
==9856== at 0x6041B1E: clone (clone.S:74) 
==9856== by 0x6852189: create_thread (createthread.c:102) 
==9856== by 0x6853EC3: [email protected]@GLIBC_2.2.5 (pthread_create.c:679) 
==9856== by 0x4C34BB7: ??? (in /usr/lib/valgrind/vgpreload_helgrind-amd64-linux.so) 
==9856== by 0x5571DB7: QThread::start(QThread::Priority) (in /usr/lib/x86_64-linux-gnu/libQt5Core.so.5.5.1) 
==9856== by 0x40F9778: ??? (in /usr/lib/x86_64-linux-gnu/libQt5XcbQpa.so.5.5.1) 
==9856== by 0x40FF5E3: QXcbConnection::QXcbConnection(QXcbNativeInterface*, bool, unsigned int, char const*) (in /usr/lib/x86_64-linux-gnu/libQt5XcbQpa.so.5.5.1) 
==9856== by 0x41029EC: QXcbIntegration::QXcbIntegration(QStringList const&, int&, char**) (in /usr/lib/x86_64-linux-gnu/libQt5XcbQpa.so.5.5.1) 
==9856== by 0x40293AC: ??? (in /usr/lib/x86_64-linux-gnu/qt5/plugins/platforms/libqxcb.so) 
==9856== by 0x63E3DD1: QPlatformIntegrationFactory::create(QString const&, QStringList const&, int&, char**, QString const&) (in /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5.5.1) 
==9856== by 0x63F0003: QGuiApplicationPrivate::createPlatformIntegration() (in /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5.5.1) 
==9856== by 0x63F0F0C: QGuiApplicationPrivate::createEventDispatcher() (in /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5.5.1) 
==9856== 
==9856== ---------------------------------------------------------------- 
==9856== 
==9856== Possible data race during read of size 4 at 0x599E9B0 by thread #1 
==9856== Locks held: none 
==9856== at 0x556AD30: QBasicMutex::unlockInternal() (in /usr/lib/x86_64-linux-gnu/libQt5Core.so.5.5.1) 
==9856== by 0x4C344E7: ??? (in /usr/lib/valgrind/vgpreload_helgrind-amd64-linux.so) 
==9856== by 0x5571D23: QThread::start(QThread::Priority) (in /usr/lib/x86_64-linux-gnu/libQt5Core.so.5.5.1) 
==9856== by 0x40F9778: ??? (in /usr/lib/x86_64-linux-gnu/libQt5XcbQpa.so.5.5.1) 
==9856== by 0x40FF5E3: QXcbConnection::QXcbConnection(QXcbNativeInterface*, bool, unsigned int, char const*) (in /usr/lib/x86_64-linux-gnu/libQt5XcbQpa.so.5.5.1) 
==9856== by 0x41029EC: QXcbIntegration::QXcbIntegration(QStringList const&, int&, char**) (in /usr/lib/x86_64-linux-gnu/libQt5XcbQpa.so.5.5.1) 
==9856== by 0x40293AC: ??? (in /usr/lib/x86_64-linux-gnu/qt5/plugins/platforms/libqxcb.so) 
==9856== by 0x63E3DD1: QPlatformIntegrationFactory::create(QString const&, QStringList const&, int&, char**, QString const&) (in /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5.5.1) 
==9856== by 0x63F0003: QGuiApplicationPrivate::createPlatformIntegration() (in /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5.5.1) 
==9856== by 0x63F0F0C: QGuiApplicationPrivate::createEventDispatcher() (in /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5.5.1) 
==9856== by 0x5757A85: QCoreApplication::init() (in /usr/lib/x86_64-linux-gnu/libQt5Core.so.5.5.1) 
==9856== by 0x5757AF5: QCoreApplication::QCoreApplication(QCoreApplicationPrivate&) (in /usr/lib/x86_64-linux-gnu/libQt5Core.so.5.5.1) 
==9856== 
==9856== This conflicts with a previous write of size 4 by thread #2 
==9856== Locks held: none 
==9856== at 0x556A977: QBasicMutex::lockInternal() (in /usr/lib/x86_64-linux-gnu/libQt5Core.so.5.5.1) 
==9856== by 0x4C34377: ??? (in /usr/lib/valgrind/vgpreload_helgrind-amd64-linux.so) 
==9856== by 0x5572754: ??? (in /usr/lib/x86_64-linux-gnu/libQt5Core.so.5.5.1) 
==9856== by 0x4C34DB6: ??? (in /usr/lib/valgrind/vgpreload_helgrind-amd64-linux.so) 
==9856== by 0x68536F9: start_thread (pthread_create.c:333) 
==9856== by 0x6041B5C: clone (clone.S:109) 
==9856== Address 0x599e9b0 is in the Data segment of /usr/lib/x86_64-linux-gnu/libQt5Core.so.5.5.1 
==9856== 
==9856== ---------------------------------------------------------------- 
==9856== 
==9856== Possible data race during write of size 8 at 0xBF41830 by thread #1 
==9856== Locks held: none 
==9856== at 0x556AD3A: QBasicMutex::unlockInternal() (in /usr/lib/x86_64-linux-gnu/libQt5Core.so.5.5.1) 
==9856== by 0x4C344E7: ??? (in /usr/lib/valgrind/vgpreload_helgrind-amd64-linux.so) 
==9856== by 0x5571D23: QThread::start(QThread::Priority) (in /usr/lib/x86_64-linux-gnu/libQt5Core.so.5.5.1) 
==9856== by 0x40F9778: ??? (in /usr/lib/x86_64-linux-gnu/libQt5XcbQpa.so.5.5.1) 
==9856== by 0x40FF5E3: QXcbConnection::QXcbConnection(QXcbNativeInterface*, bool, unsigned int, char const*) (in /usr/lib/x86_64-linux-gnu/libQt5XcbQpa.so.5.5.1) 
==9856== by 0x41029EC: QXcbIntegration::QXcbIntegration(QStringList const&, int&, char**) (in /usr/lib/x86_64-linux-gnu/libQt5XcbQpa.so.5.5.1) 
==9856== by 0x40293AC: ??? (in /usr/lib/x86_64-linux-gnu/qt5/plugins/platforms/libqxcb.so) 
==9856== by 0x63E3DD1: QPlatformIntegrationFactory::create(QString const&, QStringList const&, int&, char**, QString const&) (in /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5.5.1) 
==9856== by 0x63F0003: QGuiApplicationPrivate::createPlatformIntegration() (in /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5.5.1) 
==9856== by 0x63F0F0C: QGuiApplicationPrivate::createEventDispatcher() (in /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5.5.1) 
==9856== by 0x5757A85: QCoreApplication::init() (in /usr/lib/x86_64-linux-gnu/libQt5Core.so.5.5.1) 
==9856== by 0x5757AF5: QCoreApplication::QCoreApplication(QCoreApplicationPrivate&) (in /usr/lib/x86_64-linux-gnu/libQt5Core.so.5.5.1) 
==9856== 
==9856== This conflicts with a previous read of size 8 by thread #2 
==9856== Locks held: none 
==9856== at 0x556A9A5: QMutex::lock() (in /usr/lib/x86_64-linux-gnu/libQt5Core.so.5.5.1) 
==9856== by 0x4C34377: ??? (in /usr/lib/valgrind/vgpreload_helgrind-amd64-linux.so) 
==9856== by 0x5572754: ??? (in /usr/lib/x86_64-linux-gnu/libQt5Core.so.5.5.1) 
==9856== by 0x4C34DB6: ??? (in /usr/lib/valgrind/vgpreload_helgrind-amd64-linux.so) 
==9856== by 0x68536F9: start_thread (pthread_create.c:333) 
==9856== by 0x6041B5C: clone (clone.S:109) 
==9856== Address 0xbf41830 is 112 bytes inside a block of size 168 alloc'd 
==9856== at 0x4C2F50F: operator new(unsigned long) (in /usr/lib/valgrind/vgpreload_helgrind-amd64-linux.so) 
==9856== by 0x556D793: QThread::QThread(QObject*) (in /usr/lib/x86_64-linux-gnu/libQt5Core.so.5.5.1) 
==9856== by 0x40F96B2: ??? (in /usr/lib/x86_64-linux-gnu/libQt5XcbQpa.so.5.5.1) 
==9856== by 0x40FF5D4: QXcbConnection::QXcbConnection(QXcbNativeInterface*, bool, unsigned int, char const*) (in /usr/lib/x86_64-linux-gnu/libQt5XcbQpa.so.5.5.1) 
==9856== by 0x41029EC: QXcbIntegration::QXcbIntegration(QStringList const&, int&, char**) (in /usr/lib/x86_64-linux-gnu/libQt5XcbQpa.so.5.5.1) 
==9856== by 0x40293AC: ??? (in /usr/lib/x86_64-linux-gnu/qt5/plugins/platforms/libqxcb.so) 
==9856== by 0x63E3DD1: QPlatformIntegrationFactory::create(QString const&, QStringList const&, int&, char**, QString const&) (in /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5.5.1) 
==9856== by 0x63F0003: QGuiApplicationPrivate::createPlatformIntegration() (in /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5.5.1) 
==9856== by 0x63F0F0C: QGuiApplicationPrivate::createEventDispatcher() (in /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5.5.1) 
==9856== by 0x5757A85: QCoreApplication::init() (in /usr/lib/x86_64-linux-gnu/libQt5Core.so.5.5.1) 
==9856== by 0x5757AF5: QCoreApplication::QCoreApplication(QCoreApplicationPrivate&) (in /usr/lib/x86_64-linux-gnu/libQt5Core.so.5.5.1) 
==9856== by 0x63F2D08: QGuiApplication::QGuiApplication(QGuiApplicationPrivate&) (in /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5.5.1) 
==9856== Block was alloc'd by thread #1 
==9856== 
==9856== ---------------------------------------------------------------- 
==9856== 
==9856== Possible data race during read of size 8 at 0xBF41830 by thread #2 
==9856== Locks held: none 
==9856== at 0x556A92D: QBasicMutex::lockInternal() (in /usr/lib/x86_64-linux-gnu/libQt5Core.so.5.5.1) 
==9856== by 0x4C34377: ??? (in /usr/lib/valgrind/vgpreload_helgrind-amd64-linux.so) 
==9856== by 0x5572754: ??? (in /usr/lib/x86_64-linux-gnu/libQt5Core.so.5.5.1) 
==9856== by 0x4C34DB6: ??? (in /usr/lib/valgrind/vgpreload_helgrind-amd64-linux.so) 
==9856== by 0x68536F9: start_thread (pthread_create.c:333) 
==9856== by 0x6041B5C: clone (clone.S:109) 
==9856== 
==9856== This conflicts with a previous write of size 8 by thread #1 
==9856== Locks held: none 
==9856== at 0x556AD3A: QBasicMutex::unlockInternal() (in /usr/lib/x86_64-linux-gnu/libQt5Core.so.5.5.1) 
==9856== by 0x4C344E7: ??? (in /usr/lib/valgrind/vgpreload_helgrind-amd64-linux.so) 
==9856== by 0x5571D23: QThread::start(QThread::Priority) (in /usr/lib/x86_64-linux-gnu/libQt5Core.so.5.5.1) 
==9856== by 0x40F9778: ??? (in /usr/lib/x86_64-linux-gnu/libQt5XcbQpa.so.5.5.1) 
==9856== by 0x40FF5E3: QXcbConnection::QXcbConnection(QXcbNativeInterface*, bool, unsigned int, char const*) (in /usr/lib/x86_64-linux-gnu/libQt5XcbQpa.so.5.5.1) 
==9856== by 0x41029EC: QXcbIntegration::QXcbIntegration(QStringList const&, int&, char**) (in /usr/lib/x86_64-linux-gnu/libQt5XcbQpa.so.5.5.1) 
==9856== by 0x40293AC: ??? (in /usr/lib/x86_64-linux-gnu/qt5/plugins/platforms/libqxcb.so) 
==9856== by 0x63E3DD1: QPlatformIntegrationFactory::create(QString const&, QStringList const&, int&, char**, QString const&) (in /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5.5.1) 
==9856== Address 0xbf41830 is 112 bytes inside a block of size 168 alloc'd 
==9856== at 0x4C2F50F: operator new(unsigned long) (in /usr/lib/valgrind/vgpreload_helgrind-amd64-linux.so) 
==9856== by 0x556D793: QThread::QThread(QObject*) (in /usr/lib/x86_64-linux-gnu/libQt5Core.so.5.5.1) 
==9856== by 0x40F96B2: ??? (in /usr/lib/x86_64-linux-gnu/libQt5XcbQpa.so.5.5.1) 
==9856== by 0x40FF5D4: QXcbConnection::QXcbConnection(QXcbNativeInterface*, bool, unsigned int, char const*) (in /usr/lib/x86_64-linux-gnu/libQt5XcbQpa.so.5.5.1) 
==9856== by 0x41029EC: QXcbIntegration::QXcbIntegration(QStringList const&, int&, char**) (in /usr/lib/x86_64-linux-gnu/libQt5XcbQpa.so.5.5.1) 
==9856== by 0x40293AC: ??? (in /usr/lib/x86_64-linux-gnu/qt5/plugins/platforms/libqxcb.so) 
==9856== by 0x63E3DD1: QPlatformIntegrationFactory::create(QString const&, QStringList const&, int&, char**, QString const&) (in /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5.5.1) 
==9856== by 0x63F0003: QGuiApplicationPrivate::createPlatformIntegration() (in /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5.5.1) 
==9856== by 0x63F0F0C: QGuiApplicationPrivate::createEventDispatcher() (in /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5.5.1) 
==9856== by 0x5757A85: QCoreApplication::init() (in /usr/lib/x86_64-linux-gnu/libQt5Core.so.5.5.1) 
==9856== by 0x5757AF5: QCoreApplication::QCoreApplication(QCoreApplicationPrivate&) (in /usr/lib/x86_64-linux-gnu/libQt5Core.so.5.5.1) 
==9856== by 0x63F2D08: QGuiApplication::QGuiApplication(QGuiApplicationPrivate&) (in /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5.5.1) 
==9856== Block was alloc'd by thread #1 

버그가 실제로 있습니까?

참고 : 다른 스레드가 솔루션이되지 않기 전에 이벤트 루프를 시작하기 위해 동일한 효과가있는 대기열 된 연결로 start를 호출 해 보았습니다.

감사

답변

0

당신은 Qt는 워드 프로세서에 따라, 올바른 방법으로 QThread를 사용하지 않는 http://doc.qt.io/qt-5/qthread.html 당신은 QThread를 서브 클래스) (실행 다시 구현, 또는로 이동하여 작업자 개체를 사용할 수 있습니다하려면 다음 중 하나를 필요

스레드는 QObject :: moveToThread()를 사용합니다.

+0

그것은 단지 시작 완벽하게 합법적 인()의 일반 QThread 인스턴스 . – peppe

+0

@peppe 어떤 참조하시기 바랍니다? – HazemGomaa

+0

[시작] (https://doc.qt.io/qt-5/qthread.html#start)에 대한 QThread 문서는 다음과 같이 말합니다 : * run() *을 호출하여 스레드의 실행을 시작합니다. [run] (https://doc.qt.io/qt-5/qthread.html#run)에 대한 설명서는 다음과 같이 말합니다 : * [...] 기본 구현은 단순히 exec() *를 호출합니다. 즉, 그것은 완전히 합법적이며 행동은 잘 정의되어 있습니다. – peppe

4

helgrind는 Qt 자체에서 사용되는 원자 기술을 이해하지 못합니다. 그 경고를 억제하고 무시해야합니다. 이 가져 오기 :

https://github.com/KDE/kde-dev-scripts/blob/master/kde.supp

그리고 helgrind 명령 줄에 --suppressions=/path/to/kde.supp을 추가합니다.

Qt 응용 프로그램에서 helgrind를 사용하는 방법에 대한 자세한 내용은 this blog post을 확인하십시오.


(사이드 참고 :. 아직 프로그램을 충돌, 그래서 메인에서 반환하기 전에 가입해야합니다 실행하는 QThread를 파괴)

+0

답장을 보내 주셔서 감사합니다, 나는 이미 당신이 제안한 행운을 찾아서 시도했습니다. 나는 몇 시간 안에 결과를 게시 할 수있는 또 다른 시도를 해줄거야, 고마워! – Gianks

+0

Qt의 디버그 빌드를 사용하고 있습니까? (릴리스 빌드가 원자 단위를 인라인 할 수 있고 따라서 헬그리드를 혼동 할 수 있다고 생각합니다) – peppe