急!!!Linux编译死锁多线程在qt中报错!求大神指点!! 40C

在qt里写的死锁多线程,但是一直报错error: collect2: error: ld returned 1 exit status;
qt菜鸟感觉自己没哪里写错了,于是死都看不出bug在哪,快要die了

//Pthread.h


#include <QThread>
#include <QDebug>

class Pthread1: public QThread
{
    Q_OBJECT
protected:
  //线程退出的标识量
  volatile bool m_stop;
  void run();

signals:
  void send_signal(int);//自定义信号

public:
    Pthread1();
    ~Pthread1();
    void stop();//线程退出的接口函数,用户使用
};

class Qthread1: public QThread
{
    Q_OBJECT
protected:
  //线程退出的标识量
  volatile bool m_stop;
  void run();

signals:
  void send_signal(int);//自定义信号

public:
    Qthread1();
    ~Qthread1();
    void stop();//线程退出的接口函数,用户使用
};

//Pthread.cpp


#include "Pthread1.h"
#include <QMutex>
#include <unistd.h>  //用于sleep

QMutex MutexA;
QMutex MutexB;

Pthread1::Pthread1(){
    m_stop = false;
}

Pthread1::~Pthread1(){

}

void Pthread1::stop(){
    m_stop = true;
}

void Pthread1::run(){

    int step = 0;
    while(!m_stop)
    {
        MutexA.lock();
        step = 1;  emit send_signal(step);
        sleep(1000);
        MutexB.lock();
        step = 3;  emit send_signal(step);
        MutexA.unlock();
        step = 4;  emit send_signal(step);
        msleep(1);
        MutexB.unlock();
        step = 5;  emit send_signal(step);
        msleep(1);
    }
    m_stop = 0;

}

Qthread1::Qthread1(){
    m_stop = false;
}

Qthread1::~Qthread1(){

}

void Qthread1::stop(){
    m_stop = true;
}

void Qthread1::run(){

    int step = 0;
    while(!m_stop)
    {
        MutexB.lock();
        step = 2; emit send_signal(step);
        sleep(1000);
        MutexA.lock();
        step = 6; emit send_signal(step);
        MutexB.unlock();
        step = 7; emit send_signal(step);
        msleep(1);
        MutexA.unlock();
        step = 8; emit send_signal(step);
        msleep(1);
    }
    m_stop = 0;

}


//MainWindow.h

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0, Qt::WindowFlags flags = 0);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
    Pthread1 *p1;
    Qthread1 *q1;

public slots:
    void send_cmd(int);

    void lock();
    void unlock();
};

//MainWindow.cpp


#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <qmessagebox.h>
#include <semaphore.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>  //用于sleep

using namespace std;

MainWindow::MainWindow(QWidget *parent, Qt::WindowFlags flags) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
        p1 = new Pthread1;
    q1 = new Qthread1;

        connect(ui->pushButton_2_1_b,SIGNAL(clicked()),this,SLOT(lock()));
    connect(p1,SIGNAL(send_signal(int )),this,SLOT(send_cmd(int )),Qt::BlockingQueuedConnection);
    connect(q1,SIGNAL(send_signal(int )),this,SLOT(send_cmd(int )),Qt::BlockingQueuedConnection);

}

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

void MainWindow::send_cmd(int step){

    if(step == 1){
        //P1 get mutexA
        QPropertyAnimation *animation = new QPropertyAnimation(ui->pushButton_2_1_1,"geometry");
        animation->setDuration(1000);
        animation->setStartValue(QRect(530,140,141,71));
        animation->setEndValue(QRect(250,420,141,71));
        animation->start();
    }
    else if(step == 2){
        //Q1 get mutexB
        QPropertyAnimation *animation1 = new QPropertyAnimation(ui->pushButton_2_1_2,"geometry");
        animation1->setDuration(1000);
        animation1->setStartValue(QRect(670,210,141,71));
        animation1->setEndValue(QRect(110,420,141,71));
        animation1->start();
    }
    else if(step == 3){
        //P2 release mutexA
        QPropertyAnimation *animation3 = new QPropertyAnimation(ui->pushButton_2_1_1,"geometry");
        animation3->setDuration(1000);
        animation3->setStartValue(QRect(250,420,141,71)); animation3->setEndValue(QRect(390,420,141,71));
        animation3->start();
        QPropertyAnimation *animation4 = new QPropertyAnimation(ui->pushButton_2_1_1,"geometry");
        animation4->setDuration(1000);
        animation4->setStartValue(QRect(390,420,141,71)); animation4->setEndValue(QRect(390,280,141,71));
        animation4->start();
    }
    else if(step == 4){
        //P2 get mutexB
        QPropertyAnimation *animation5 = new QPropertyAnimation(ui->pushButton_2_1_2,"geometry");
        animation5->setDuration(1000);
        animation5->setStartValue(QRect(530,210,141,71)); animation5->setEndValue(QRect(530,420,141,71));
        animation5->start();
    }
    else if(step == 5){
        //P2 release mutexB
        QPropertyAnimation *animation6 = new QPropertyAnimation(ui->pushButton_2_1_2,"geometry");
        animation6->setDuration(1000);
        animation6->setStartValue(QRect(530,420,141,71)); animation6->setEndValue(QRect(670,420,141,71));
        animation6->start();
        QPropertyAnimation *animation7 = new QPropertyAnimation(ui->pushButton_2_1_2,"geometry");
        animation7->setDuration(1000);
        animation7->setStartValue(QRect(670,420,141,71)); animation7->setEndValue(QRect(670,210,141,71));
        animation7->start();
    }
    else if(step == 6){
        //Q2 get mutexA
        QPropertyAnimation *animation9 = new QPropertyAnimation(ui->pushButton_2_1_1,"geometry");
        animation9->setDuration(1000);
        animation9->setStartValue(QRect(390,280,141,71)); animation9->setEndValue(QRect(110,280,141,71));
        animation9->start();
    }
    else if(step == 7){
        //Q2 release mutexB
        QPropertyAnimation *animation10 = new QPropertyAnimation(ui->pushButton_2_1_2,"geometry");
        animation10->setDuration(1000);
        animation10->setStartValue(QRect(110,420,141,71)); animation10->setEndValue(QRect(110,210,141,71));
        animation10->start();
        QPropertyAnimation *animation11 = new QPropertyAnimation(ui->pushButton_2_1_2,"geometry");
        animation11->setDuration(1000);
        animation11->setStartValue(QRect(110,210,141,71)); animation11->setEndValue(QRect(530,210,141,71));
        animation11->start();
    }
    else if(step == 8){
        //Q2 release mutexA
        QPropertyAnimation *animation12 = new QPropertyAnimation(ui->pushButton_2_1_1,"geometry");
        animation12->setDuration(1000);
        animation12->setStartValue(QRect(110,280,141,71));
        animation12->setEndValue(QRect(110,140,141,71));
        animation12->start();
        QPropertyAnimation *animation13 = new QPropertyAnimation(ui->pushButton_2_1_1,"geometry");
        animation13->setDuration(1000);
        animation13->setStartValue(QRect(110,140,141,71));
        animation13->setEndValue(QRect(530,140,141,71));
        animation13->start();
    }

}

void MainWindow::lock(void) {

    q1->start();
    p1->start();
    q1->stop();
    p1->stop();
    q1->wait();
    p1->wait();

}

顺便想问一句,怎样在qt里一次创建多个线程就像Thread[ ]类似数组那样!!!

0

1个回答

error: collect2: error: ld returned 1 exit status说明编译有错误,程序根本没有运行起来,检查下你的代码

4
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
Linux C/C++ 多线程死锁的gdb调试方法
死锁的原因就不多说了,本质上,就是有一些线程在请求锁的时候,永远也请求不到。   先把有死锁的多线程代码贴出来 #include #include #include #include #include pthread_mutex_t g_smutex ; void * func(void *arg) { int i=0; //lock pthread_mut
net-snmp 线程安全
#include #include #include #include #include #include #include #include #include struct thread_info { pthread_t id; int num; char *sw_ip; char *community; char *oid; }; int sess_call
多线程程序中死锁的分析和解决方案
死锁是由于不同线程按照不同顺序进行加锁而造成的。如: 线程A:对lock a加锁 => 对lock b加锁 => dosth => 释放lock b => 释放lock a 线程B:对lock b加锁 => 对lock a加锁 => dosth => 释放lock a => 释放lock b 这样两条线程,就可能发生死锁问题。要避免发生死锁,应该使用同一个顺序进行加锁。 这点在对象单向调用的情况下
多线程编程:线程死锁的原因以及解决方法
多线程编程:线程死锁的原因以及解决方法 关于线程死锁这个问题相信程序员在编写多线程程序时会经常遇到的一个经典问题,这种情况往往出现在多个线程同时对临界资源访问时所产生的。 属于临界资源的硬件有打印机、磁带机等,软件有消息缓冲队列、变量、数组、缓冲区等。诸进程间应采取互斥方式,实现对这种资源的共享。 当我们在使用两个不同的线程访问同一个临界资源时就会出现如下情况: 线程A优先被创
多线程死锁及解决办法
死锁是由于不同线程按照不同顺序进行加锁而造成的。如: 线程A:对lock a加锁 => 对lock b加锁 => dosth => 释放lock b => 释放lock a 线程B:对lock b加锁 => 对lock a加锁 => dosth => 释放lock a => 释放lock b 这样两条线程,就可能发生死锁问题。要避免发生死锁,应该使用同一个顺序进行加锁。
QT程序调试(资源死锁问题)
最近动手在师兄写的一个小的QT界面上添加了一点小的框架,在调试的过程中程序会crash,找了很久的原因,终于找到的问题的存在,在这里记录一下,以防止以后会碰到类似的情况! 问题:程序crash的地方调试显示 Resource Deadlock,原因在于整个程序同时运行了两个线程,其中一个是图形界面MainWindow的线程,另一个则是定义的接收数据的线程,在图形界面中有一个按钮StopButto
Qt Creator使用多线程编辑,增加编译速度
如图设置,(我个人习惯,重新构建,编译。以确保不出现一些不必要的小毛病):
如何避免多线程中死锁?
死锁 一个经典的多线程问题。 当一个线程永远地持有一个锁,并且其他线程都尝试去获得这个锁时,那么它们将永远被阻塞,这个我们都知道。如果线程A持有锁L并且想获得锁M,线程B持有锁M并且想获得锁L,那么这两个线程将永远等待下去,这种情况就是最简单的死锁形式。 在数据库系统的设计中考虑了监测死锁以及从死锁中恢复,数据库如果监测到了一组事物发生了死锁时,将选择一个牺牲者并放弃这个事物。J
Linux:浅析死锁问题
在浅析线程的同步互斥的博客中提到死锁问题。 那么什么是死锁呢? 死锁的概念 在某一个程序当中,由于一些原因,导致某一个进程或者线程无限期的占有一种或多种公共资源不归还。导致其他进程或者是线程将永远获取不到这些公共资源,而进程或线程选择进行挂起等待公共资源,进而导致这些线程或进程的饥饿问题。这就是死锁问题。 形成死锁的四个必要条件 互斥使用资源 占有和等待资源 不可抢夺资源 循环等待资源...
在Ubuntu下qt creator 在C++的多线程
1.一直是用Qt creator做IDE来使用,然后Ubuntu用到多线程,如 int ret = pthread_create(&tids[i], NULL, say_hello, NULL);写完之后,如果直接用IED编译,会说没有定义这个函数,可以用终端g++$ g++ test.cpp -lpthread -o test.o但这样不方便,最好在qt creator中直接编译。因此
QtCreator 多核编译
使用mingw的时候常用: 菜单栏-&amp;gt;工具-&amp;gt; 选项-&amp;gt;构建与运行-&amp;gt;构建套件-&amp;gt;点击自动检测内容-&amp;gt;在同一页面找到 Environment -&amp;gt;点击change -&amp;gt; 在弹出的窗口 添加MAKEFLAGS=-j8 -j8 :表示使用8个处理器逻辑核心数参加编译   如果是编译器用的是ms的vc++,则需要在.pro文件中添加 QMAKE_...
Linux 多线程程序调用malloc,backtrace引发死锁问题的调试
信号处理函数必须是可重入函数,否则在多线程设计结构中容易造成不可预知的错误或造成程序死锁。
多线程之如何查看线程死锁
因为线程死锁程序可能只是卡住了,但是没有报错,你也不清楚哪里出了问题,那么你就要想到是否会出现死锁的问题 idea卡住了 打开命令行输入jsp,查看进程,并输入jstack (进程号) 如果是死锁的话会提示,然后找到对应的代码就好了...
Linux--线程死锁
线程为什会死锁??“锁”又是什么东西?我们这篇博客主要讲一下为什么要给线程加锁,为什么会出现线程死锁,线程死锁怎么解决。互斥锁在我的上篇博客已经讲解了一些线程的基本知识Linux–线程控制我们可以了解到线程是共享同一份内存的。这就意味着多个线程同时访问共享数据时可能发生冲突。分析程序我们首先分析一个小程序:#include<stdio.h> #include<stdlib.h> #include<p
多线程调试--死锁,死循环都可用这个方法
_doMonitor线程中,重复加同一个锁,引起死锁。 [root@localhostroot]#  gdb  attach  131081 (gdb) infothreads   26Thread 540697 (LWP 30861)  0x00c40094 in__pthread_sigsuspend () from /lib/i686/libpthread.so.0   25T
(地主源代码)求解! 做的不够好,求大神指点
(地主源代码)求解! 做的不够好,求大神指点
多线程死锁例子
一.例子  两个资源对象o1,o2,两个线程t1,t2。 设置t1的初始条件为真,线程启动后。t1获取o1锁,然后等待o2。然后获取o2锁,然后释放o2锁。接着释放o1锁。程序结束 设置t2的初始条件为真,线程启动后。t2获取o2锁,然后等待o1。然后获取o1锁,然后释放o1锁。接着释放o2锁。程序结束 public class DeadLocker { public static
线程死锁的原理及解决方式
转至:https://blog.csdn.net/ls5718/article/details/51896159 一、死锁的定义 多线程以及多进程改善了系统资源的利用率并提高了系统 的处理能力。然而,并发执行也带来了新的问题——死锁。所谓死锁是指多个线程因竞争资源而造成的一种僵局(互相等待),若无外力作用,这些进程都将无法向前推进。 下面我们通过一些实例来说明死锁现象。 先看生活中的一个实...
Linux下死锁的必要条件及如何避免死锁
死锁产生的原因: (1) 因为系统资源不足。 (2) 进程运行推进的顺序不合适。 (3) 资源分配不当等。 如果系统资源充足,进程的资源请求都能够得到满足,死锁出现的可能性就很低,否则就会因争夺有限的资源而陷入死锁。其次,进程运行推进顺序与速度不同,也可能产生死锁。 产生死锁的四个必要条件: (1) 互斥条件:一个资源每次只能被一个进程使用。 (2) 请求与保持条件:一个
Qt多线程编程: QMutex
QMutex
多线程怎么避免死锁
当两个线程同时运行时,A线程拥有lock A,在等待lock B,而B线程拥有lock B,在等待lock A,那么这两个线程都在等待对方释放锁,并且谁也不会先释放锁,那么就陷入了死锁。 死锁的解决办法有三个,设置加锁顺序、设置加锁时限、开启死锁检测。   加锁顺序 当多个线程需要相同的一些锁,但是按照不同的顺序加锁,死锁就很容易发生。如果能确保所有的线程都是按照相同的顺序获得锁,那么死锁...
在多线程中使用fork函数导致死锁,以及解决方案
    在多线程编程中,如果某个线程调用了fork()函数创建子进程,创建的子进程将继承父进程所有的锁。    如果在父进程中加锁了,而在子进程中对锁重新加锁,将会导致死锁,以下是导致死锁的代码#include&amp;lt;stdio.h&amp;gt; #include&amp;lt;pthread.h&amp;gt; #include&amp;lt;unistd.h&amp;gt; #include&amp;lt;wait.h&amp;gt; #incl...
尽量避免多进程多线程混用,当下死锁
一句话总结:父进程创建子进程时,子进程会复制父进程的内存(包括锁状态),需仔细处理。 1、死锁例子 #include #include #include #include pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; void* doit(void* arg) {
Linux Qt下简单的多线程编程例子
Linux Qt下简单的多线程编程例子,具体内容可以参考文章http://blog.csdn.net/maxwell_nc/article/details/44198811
Linux--死锁产生条件及避免死锁算法
一.什么是死锁? 所谓死锁是指在多道程序系统中,一组进程中的每一个进程均无限期的等待被该组进程中的另一个进程所占有且永远不会释放的资源,这种现象称系统处于死锁状态。   二.死锁产生的原因? 1.竞争资源,系统产生的资源有限不能满足每个进程的需求。 2.多道程序运行时,进程推进顺序不合理。   三.形成死锁四个必要条件? 1.互斥使用资源 2.请求和保持资源 3.不可抢夺资源
28-线程同步——死锁现象
1. 死锁现象一   死锁在多线程中是非常经典,常见的现象。来看一个最简单的死锁问题,有时候一个线程对同一个互斥量加锁两次,那么该线程就会阻塞,这种现象就是死锁,另外,其他方式也有可能产生死锁。 1 . 线程试图对同一个互斥量加锁两次:   线程1拿到锁后,调用pthread_mutex_lock进行加锁成功,访问数据时,线程1闲着无聊又调用了pthread_mutex_lock加锁。这时线...
多线程死锁以及解决方法
解决死锁没有简单的方法,这是因为线程产生死锁都各有各的原因,而且往往具有很高的负载。大多数软件测试产生不了足够多的负载,所以不可能暴露所有的线程错误。在这里中,下面将讨论开发过程常见的4类典型的死锁和解决对策。 (1)数据库死锁    在数据库中,如果一个连接占用了另一个连接所需的数据库锁,则它可以阻塞另一个连接。如果两个或两个以上的连接相互阻塞,则它们都不能继续执行,这 种情况称为数
树莓派3B Linux下C++多线程编程
下面的代码手动创建了两个线程,一个线程是读取串口的数据,另一个线程是通过UDP来读取网络通信收到的数据。加上main函数的线程,一共三个线程。先简单讲一下多线程的创建, pthread_t serial; int ser = pthread_create(&serial,NULL,connectSerial,NULL); if(ser != 0) { s
多线程安全及死锁、等待唤醒
售票的案例      /*       * 多线程并发访问同一个数据资源       * 3个线程,对一个票资源,出售       */      public class ThreadDemo {       public static void main(String[] args) {         //创建Runnable接口实现类对象         Tickets t...
多线程死锁及coredump
转载自: http://www.cnblogs.com/zhuyp1015/p/3618863.html      据说再高的高手在写多线程程序的时候都难确保不会产生死锁,死锁的调试也就成为一个比较常见的问题,假设有下面这样一个问题:   一个正在生产环境下运行的进程死锁了,或者你只是在跑一个程序,并没有在调试器里面打开它,然后发现没有响应,日志输出也停止了。由于你是一个有经验的程序
多线程死锁的一个简单例子
package web1; import java.util.concurrent.atomic.AtomicInteger; public class Main1 {     public static void main(String[] args) {         AtomicInteger count = new AtomicInteger(0);
Qt/C++ Qt多线程竟然不能使用VC的套路
Qt我创建如下代码,在VC下这类似的东西是没有问题的,Qt是不可以的~class MainWindow : public QMainWindow { Q_OBJECTpublic: explicit MainWindow(QWidget *parent = 0); ~MainWindow(); /* * @brief:开始线程,这里是另线程的一起点 */ stati
QT编程问题小结(编译、多线程、UDP Socket等)
1. 编译问题(error 127) 如果计算机中配置了MinGW、CygWin等编译器,那么在编译QT程序时可能会报错,错误代码为 error 127. 这时把系统环境变量PATH中MinGW、CygWin的路径删除,或者修改MinGW、CygWin的文件夹名称(使系统环境变量无效),即可解决上述问题。 2.多线程使用心得 (1)多线程的一种方法是使用QThread类,并且需要使
linux登陆之后显示bash-3.00$
这是由bash中的PS1环境变量控制的,bash-3.00应该是你系统默认的PS1环境变量,你可以通过echo 应该是你系统默认的PS1环境变量,你可以通过echo PS1来查看它的值。 要修改的话在.bashrc配置文件中对PS1重新赋值就可以了,比如常用的为:**export PS1=’\u@- **h:\w$’ 修改好后,保存配置文件,执行source .bashrc命令就可以立即生效。
Linux上QT环境配置,编译常见错误,简单Hello QT程序
     本文用于记载在Linux上安装QT及在此过程中遇到的各种问题,百度中有很多版本的解决方法,可是太多都模棱两可,方法也千篇一律,不能实际解决问题,本文仅用于打卡,为以后的此类问题找到一个可追溯的文档。一, 软件说明      本人使用的虚拟机是VMware-workstation-full-14.1.1.28517.exe      Linux版本是ubuntukylin-16.04-de...
Linux C++如何定位死锁
Linux C++如何定位死锁 本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦: - 死锁是如何产生 - 死锁是如何避免 - 构造死锁应用程序 - https://blog.csdn.net/zhangfengaiwuyan/article/details/17210423 - 死锁定位分析 - 无符号表死锁定位分析 构造死锁应用程序 ...
condition_variable的使用以及与锁的关系
条件变量和互斥锁是多线程的同步和互斥最基础的两种工具,其中互斥锁使用和功能都比较简单,条件变量在使用和理解起来相对就比较困难,不少初学者对于wait函数必须结合一个锁来使用的原则感到困惑,其实官方指导中已经有详尽的解释和案例,但讲的比较简洁,这里从wait函数执行流程来看下条件变量的使用方法和原理。 正确使用流程 thread1: locker.lock() ---1 cv.wait(...
多线程中产生死锁的原因和解决死锁的办法
产生死锁的原因:(1)竞争系统资源 (2)进程的推进顺序不当   产生死锁的必要条件: 互斥条件:进程要求对所分配的资源进行排它性控制,即在一段时间内某资源仅为一进程所占用。 请求和保持条件:当进程因请求资源而阻塞时,对已获得的资源保持不放。 不剥夺条件:进程已获得的资源在未使用完之前,不能剥夺,只能在使用完时由自己释放。 环路等待条件:在发生死锁时,必然存在一个进程--资源的环形链。...
一个多线程的死锁和锁争用的例子
在多线程编程中,为了保持同步,需要使用互斥锁保护临界区,但是多线程共同使用互斥锁的时候会造成死锁或者锁争用的情况: 死锁: 产生死锁的原因主要是: (1) 因为系统资源不足。 (2) 进程运行推进的顺序不合适。 (3) 资源分配不当等。 如果系统资源充足,进程的资源请求都能够得到满足,死锁出现的可能性就很低,否则 就会因争夺有限的资源而陷入死锁。其次,进程运行推进顺序与速度不同,也可
多线程——死锁的例子
在面试的过程中可能会要求写出一个死锁的例子:public class Lock implements Runnable{ public static Object o1=new Object(); public static Object o2=new Object(); int flage; public Lock(int flage){ this.
文章热词 机器学习教程 Objective-C培训 交互设计视频教程 颜色模型 设计制作学习
相关热词 mysql关联查询两次本表 native底部 react extjs glyph 图标 java大神班 大数据大神班