多线程执行顺序诡异现象谈,你不知道的pthread_create

简介:

引文:学而时习之,不亦说乎。总是忙于具体项目,业务功能的实现;关于编程本身的技能都要有些生疏了,于是就选择了几个专题做了一次温习,重点放在了多线程和多进程上,跑了一个实例,居然有新的发现:

(1)多个线程顺序创建的顺序=线程执行顺序吗?

(2)多个线程顺序创建,回调函数执行顺序有规律吗?

示例


#include "apue.h"
#include <pthread.h>

void *
thr_fn1(void *arg)
{
    printf("thread 1 returning\n");
    return((void *)1);
}

void *
thr_fn2(void *arg)
{
    printf("thread 2 exiting\n");
    pthread_exit((void *)2);
}

int
main(void)
{
    int            err;
    pthread_t    tid1, tid2;
    void        *tret;

    err = pthread_create(&tid1, NULL, thr_fn1, NULL);
    if (err != 0)
        err_quit("can't create thread 1: %s\n", strerror(err));
    /*sleep(1);*/
    err = pthread_create(&tid2, NULL, thr_fn2, NULL);
    if (err != 0)
        err_quit("can't create thread 2: %s\n", strerror(err));
    err = pthread_join(tid1, &tret);
    if (err != 0)
        err_quit("can't join with thread 1: %s\n", strerror(err));
    printf("thread 1 exit code %d\n", (int)tret);
    err = pthread_join(tid2, &tret);
    if (err != 0)
        err_quit("can't join with thread 2: %s\n", strerror(err));
    printf("thread 2 exit code %d\n", (int)tret);
    exit(0);
}

输出

thread 2 exiting
thread 1 returning
thread 1 exit code 1
thread 2 exit code 2

讨论

  看到这个顺序是否有点意外,从多线程实现的机制来讲,这个顺序是没问题的,创建的过程不等于执行的过程,各种教科书都会这么告诉我们。可是我想知道的是,创建的顺序是否和执行的顺序有关系呢?还是用数据说话吧,我执行了10次,每次的输出顺序都是如此。这个引起了我的兴趣。线程2为何每次都是优先于线程1执行呢?按照cup顺序工作的原理,线程1应该先得到时间片才对啊,至少线程1和线程2应该具有同等的执行顺序才对。为何每次的结果都是线程2限制性?却是线程1先完成呢?纠结探索中,有条件的园友可以自己测试一下,看看是否有同样的问题呢。

疑问1:同时创建线程是否线程2优先于1呢?-----单台机器实测来看貌似如此。

疑问2:顺序创建时间差增大,执行顺序会如何?我在线程1创建后做了一个sleep(1),结果:

thread 1 returning
thread 1 exit code 1
thread 2 exiting
thread 2 exit code 2

疑问3:顺序创建线程,线程2的执行顺序为何优于线程1?探索中...!求答案!

环境

vmware8.0 + windows xp + REHL6.3


目录
相关文章
线程执行顺序怎么控制?
线程执行顺序怎么控制?
52 0
|
Java 调度
多线程执行顺序以及run方法的调用
多线程执行顺序以及run方法的调用
多线程执行顺序以及run方法的调用
|
Java
【高并发】线程的执行顺序没你想的那么简单
调用Thread的start()方法启动线程时,线程的执行顺序是不确定的。也就是说,在同一个方法中,连续创建多个线程后,调用线程的start()方法的顺序并不能决定线程的执行顺序。
306 1
【高并发】线程的执行顺序没你想的那么简单
|
编译器 Linux 调度
线程 - 线程优先级的高低和执行顺序的关系
线程 - 线程优先级的高低和执行顺序的关系
223 0
|
Java
注意:线程的执行顺序与你想的并不一样!!
调用Thread的start()方法启动线程时,线程的执行顺序是不确定的。也就是说,在同一个方法中,连续创建多个线程后,调用线程的start()方法的顺序并不能决定线程的执行顺序,今天,我们就一起来看看线程到底是如何执行的,它的执行顺序又是怎样的呢?
932 0
注意:线程的执行顺序与你想的并不一样!!
高并发之——线程的执行顺序
调用Thread的start()方法启动线程时,线程的执行顺序是不确定的。也就是说,在同一个方法中,连续创建多个线程后,调用线程的start()方法的顺序并不能决定线程的执行顺序。
168 0
|
Java
java 中线程执行顺序控制
[java] view plain copy   Thread t1 = new Thread(new Runnable() {          @Override       public void run() {           System.
529 0
|
2月前
|
存储 消息中间件 资源调度
C++ 多线程之初识多线程
这篇文章介绍了C++多线程的基本概念,包括进程和线程的定义、并发的实现方式,以及如何在C++中创建和管理线程,包括使用`std::thread`库、线程的join和detach方法,并通过示例代码展示了如何创建和使用多线程。
55 1
C++ 多线程之初识多线程