我有两个主题一和二。由头文件中各自的类定义。我想在第一个线程启动时启动第二个线程。在第一个产生意外结果的构造函数中创建和启动第二个线程。 我的头文件“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);
}
线程二的调用和处理应该由第一个线程完成..
答案 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();
}