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

时间:2011-03-08 09:15:02

标签: c++ multithreading qt concurrency 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

我的班级文件“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);

}

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

  

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

     

如何启动第二个帖子以及第一个帖子,而不是明确地在主要语句中调用两个,即

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

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

1 个答案:

答案 0 :(得分: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              | 

要注意的是线程上下文之间没有“调用”。两个线程同时执行,并使用数据进行通信(两个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();
}