当前位置: 代码迷 >> QT开发 >> 关于线程施行顺序
  详细解决方案

关于线程施行顺序

热度:85   发布时间:2016-04-25 03:58:56.0
关于线程执行顺序

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时间片到了,就该哪个了。。
------解决方案--------------------
他们相互之间没有关系,各跑各的,顺序不一定的,你启动线程,线程就和主进程就同时跑了。
  相关解决方案