博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
多线程执行顺序诡异现象谈,你不知道的pthread_create
阅读量:7104 次
发布时间:2019-06-28

本文共 1663 字,大约阅读时间需要 5 分钟。

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

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

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

示例

#include "apue.h"#include 
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);}intmain(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

转载地址:http://oguhl.baihongyu.com/

你可能感兴趣的文章
高速队类实现(线程安全)
查看>>
css3 transition 过渡动画
查看>>
CSS基础入门视频教程荟萃
查看>>
centos7 安装maven
查看>>
FTPClient与commons-pool2
查看>>
C++中的类型转换
查看>>
恰逢其时:从混合架构向一站式企业级Hadoop架构迈进
查看>>
Glossy Button
查看>>
SegmentedControl
查看>>
Contacts Multi Picker
查看>>
[应用模板]HTML5+Phonegap通讯录
查看>>
开源 java CMS - FreeCMS2.6 热词管理
查看>>
from selenium.webdriver.common.keys import Keys
查看>>
mysql 配置
查看>>
AngularJS 中文资料+工具+库+Demo 大搜集
查看>>
碎碎念01
查看>>
微软老将Philip Su的离职信:回首12年职场生涯
查看>>
CentOS 查看IP,端口 修改IP,打开端口生效
查看>>
让history命令可以记录所有shell命令的执行时间
查看>>
SQL联合语句的视觉解释
查看>>