首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > QT开发 >

奇怪的多线程调试。gdb调试二个线程,F10几十次后,崩溃了,报错。贴上源码

2013-04-26 
奇怪的多线程调试。gdb调试2个线程,F10几十次后,崩溃了,报错。贴上源码。新建的工程,就只是建了2个线程,并且2

奇怪的多线程调试。gdb调试2个线程,F10几十次后,崩溃了,报错。贴上源码。
新建的工程,就只是建了2个线程,并且2个线程在运行。对2个线程需要进入的函数MainWindow::TestThread1()、MainWindow::TestThread2()设了断点,按F10几十次后,程序就报“底层由于接收到操作系统的信号而停止,信号名称:SIGSEGV 信号含义:Segmentation fault”。源码:

MainWindow.h


#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QMutex>
#include "cthread1.h"
#include "cthread2.h"

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT
    
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

public:
    int TestThread1();
    int TestThread2();
    
private:
    Ui::MainWindow *ui;

    QMutex m_mutex1;
    QMutex m_mutex2;

    CThread1 thread1;
    CThread2 thread2;
};

#endif // MAINWINDOW_H


MainWindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow),
    m_mutex1(QMutex::Recursive),
    m_mutex2(QMutex::Recursive),
    thread1(this),
    thread2(this)
{
    ui->setupUi(this);

    thread1.start();
    thread2.start();
}

MainWindow::~MainWindow()
{
    delete ui;
}

int MainWindow::TestThread1()
{
    QMutexLocker locker(&m_mutex1);

    static int a = 0;
    a++;
    return a;
}

int MainWindow::TestThread2()
{
    QMutexLocker locker(&m_mutex2);

    static int a = 0;
    a++;
    return a;
}


CThread1.cpp

#include "cthread1.h"
#include "mainwindow.h"

CThread1::CThread1(QObject *parent) :
    QThread(parent)
{
}

void CThread1::run()
{
    while(true)
    {
        MainWindow* w = (MainWindow*)this->parent();
        w->TestThread1();

        msleep(200);
    }
}


CThread2.cpp

#include "cthread2.h"
#include "mainwindow.h"

CThread2::CThread2(QObject *parent) :
    QThread(parent)
{
}

void CThread2::run()
{
    while(true)
    {
        MainWindow* w = (MainWindow*)this->parent();
        w->TestThread2();

        msleep(200);
    }


}


[解决办法]
是这样的,多线程的环境一般不建议断点调试,否则会出现错误.
这个代码如果非调试状态,会有问题吗?

热点排行