zl程序教程

您现在的位置是:首页 >  后端

当前栏目

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

多线程执行 知道 顺序 create 现象 pthread 诡异
2023-09-14 08:57:58 时间

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

(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);

main(void)

 int err;

 pthread_t tid1, tid2;

 void *tret;

 err = pthread_create( tid1, NULL, thr_fn1, NULL);

 if (err != 0)

 err_quit("cant create thread 1: %s\n", strerror(err));

 /*sleep(1);*/

 err = pthread_create( tid2, NULL, thr_fn2, NULL);

 if (err != 0)

 err_quit("cant create thread 2: %s\n", strerror(err));

 err = pthread_join(tid1, tret);

 if (err != 0)

 err_quit("cant 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("cant 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



终于明白:有了线程,为什么还要有协程? 并发的发展历史 其实,在早期计算机并没有包含操作系统,这个时候,这个计算机只跑一个程序,这个程序独享计算机的所有资源,这个时候不存在什么并发问题,但是对计算机的资源来说,确实是一种浪费。早期编程都是基于单进程来进行,随着计算机技术的发展,于是,操作系统出现了,操作系统改变了这种现状,让计算机可以运行多个程序,并且不同的程序占用独立的计算机资源,如内存,CPU等。
一个线程中断的Bug:明明中断了线程,却为何不起作用呢? 一个线程中断的Bug:当我们在调用Java对象的wait()方法或者线程的sleep()方法时,需要捕获并处理InterruptedException异常。如果我们对InterruptedException异常处理不当,则会发生我们意想不到的后果!今天,我们就以一个案例的形式,来为大家详细介绍下为何中断执行的线程不起作用。
死锁问题的描述和代码体现 死锁问题的描述和代码体现 同步弊端:效率低;如果出现了同步嵌套,就容易产生死锁问题。 死锁问题:是指两个或者两个以上的线程在执行的过程中,因争夺资源产生的一种互相等待现象。 同步代码块的嵌套案例代码如下: 1 package cn.
胖子哥 数据仓库模型设计专家,主要从事金融,互联网行业广告行业数据架构和数据营销。QQ:1106110976