c ++ qthread同时启动2个线程

Adi*_*a P 1 c++ concurrency qt multithreading qthread

我有两个线程一和二.由头文件中各自的类定义.我想在第一个线程启动时启动第二个线程.在第一个产生意外结果的构造函数中创建和启动第二个线程.我的头文件"header.h"

#ifndef HEADER
#define HEADER
#include <QtGui>
class One:public QThread
{
public:
    One();
    void run();

};

class Two:public QThread
{
public:
    Two();
    void run();
};
#endif
Run Code Online (Sandbox Code Playgroud)

我的班级文件"main.cpp"

#include "header.h"
#include<iostream>
using namespace std;

One::One()
{
/* the output just hangs at thread two and does not get to thread one run */
Two b;
b.start();
b.wait();

}
void One::run()
{
    cout<<"One run\n";
    int i=0;
    for(;;)
    {

        i++;
        cout<<"+++ "<<i<<endl;
        if(i==10)
            break;
        sleep(3);
    }
}

Two::Two()
{

}
void Two::run()
{

    cout<<"Two run\n";
    int i=0;
    for(;;)
    {

        i--;
        cout<<"----- "<<i<<endl;
        sleep(3);
    }
}
int main(int argc,char* argv[])
{
    One a;
   // Two b;
    a.start();
   // b.start();
   a.wait();
   // b.wait();
    return(0);

}
Run Code Online (Sandbox Code Playgroud)

这是我期望输出运行的工作代码.

编辑:更改了代码,以便现在两个线程都是正确独立的

我如何与第一个线程一起启动第二个线程,而不是在main中显式调用两个.

int main(int argc,char* argv[])
{
     One a;
    Two b;
    a.start();
    b.start();
    a.wait();
    b.wait();
   return(0);
}
Run Code Online (Sandbox Code Playgroud)

线程二的调用和处理应该由线程一来完成.

Eri*_*rik 6

我相信你可能误解了一些线程概念.听起来你想要启动两个线程,然后从一个线程上下文调用另一个线程上下文,这不是线程的工作方式.

当您启动这两个线程时,它们彼此独立地执行.他们可以共享数据访问权限,但您无法以您希望的方式将其执行交织在一起.如果你想让一个线程根据另一个线程的请求执行某些操作,你有两个决定两件事:

  • 使用哪种机制将请求从一个线程发送到另一个线程
  • 请求线程是否应该停止并等待"收据",或者只是在另一个线程执行它所要求的内容时快乐地继续.

一个非常简单(并且不是非常安全,这只是说明逻辑)这样做的机制是使用两个bool来发出请求信号,例如:

Thread one starts                         | Thread two starts
Thread one works                          | Thread two loops checking a `bool DoSomething;`
Thread one sets bool DoSomething          | 
Thread one loops waiting for DidSomething | Thread two beeps
                                          | Thread two sets DidSomething
Thread one continues working              | 
Run Code Online (Sandbox Code Playgroud)

要注意的是线程上下文之间没有"调用".两个线程同时执行,并使用数据(两个bool)进行通信.

在实际的多线程中,您必须担心同时访问数据.如果两个线程同时在双核机器上尝试将数据附加到同一列表,则会发生什么情况.两个线程都可以看到相同的"列表末尾指针",两者都会创建一个新条目,两者都会更新"列表末尾指针".但其中一个更改将覆盖另一个,最好的情况是你有一些丢失的数据和内存泄漏,在最坏的情况下你会崩溃.

这是您使用"互斥"机制的地方:每个线程在访问列表之类的共享资源之前,将获取互斥锁.互斥体的构造方式使得一次只有一个线程可以"拥有"它.如果线程1首先获得互斥锁,它将继续进行列表更新,然后释放互斥锁.与此同时,其他线程尝试获取互斥锁将只是坐在那里,Mutex :: acquire()调用将不会返回,直到线程一完成互斥锁.如果两个线程都表现良好,并在访问共享列表之前获取互斥锁,则不会发生上述同步更新,并且在两个线程更新后,列表将完全有效.

回应评论:

您无法同时启动两个线程.最接近的近似值是在One :: run中创建和启动Two:

void One::run()
{
    Two b;
    b.start();
    cout<<"One run\n";
    int i=0;
    for(;;)
    {

        i++;
        cout<<"+++ "<<i<<endl;
        if(i==10)
            break;
        sleep(3);
    }
    b.wait();
}
Run Code Online (Sandbox Code Playgroud)