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

关于线程施行顺序

2013-04-21 
关于线程执行顺序int main(int argc, char *argv[]){QApplication app(argc,argv)Productor pCustomer c

关于线程执行顺序


int main(int argc, char *argv[])
{
    QApplication app(argc,argv);

    Productor p;
    Customer c;

    p.start();   //*
    c.start();

    p.wait();
    c.wait();
    return app.exec();
}

单步调试时的顺序是:执行c.start()之后进入Productor类的run()函数。我的疑问是p.start()后p并没有阻塞为什么会执行c.start()而不是直接进入p的run()函数

*多线程理解的不是太好有没有什么可以看的书?
[解决办法]
pthread_crete或beginThread一样的 创建完线程后,可以执行run,也可以继续往下走,取决于各个平台的实现

[解决办法]
创建线程的语句类似调用函数,它们之间的区别是执行流的区别:
函数调用,只要不阻塞就会直到返回才会接着执行后面的语句
创建新线程不一样,创建线程之后,该进程空间中有两个执行流,一个是原来的线程,一个是新线程,它们之间的执行顺序和你的代码没有任何关系,它们之间执行顺序取决于操作系统的调度,因此执行顺序是随机的,如果你控制几个线程之间的执行顺序,你需要使用线程之间的同步机制。

就拿你的代码举个例子:
main
 
[解决办法]

单一执行流
 
[解决办法]

 
[解决办法]

p.start();   这里创建了新线程,此后就多了一个执行流
 
[解决办法]
    \    
 
[解决办法]
     \
 
[解决办法]
      \
原      新
 
[解决办法]
        ...
c.start();
 ...
[解决办法]
取决于CPU的时间片轮询
[解决办法]
1、P.start() 被调用后立即返回了,所以可以执行c.start().
2、p.start()其实你调用的重载的run函数,而这个函数被执行实在一个子线程里执行
[解决办法]
cpu时间片到了,就该哪个了。。
[解决办法]
他们相互之间没有关系,各跑各的,顺序不一定的,你启动线程,线程就和主进程就同时跑了。

热点排行