多线程执行顺序诡异现象谈,你不知道的pthread_create
引文:学而时习之,不亦说乎。总是忙于具体项目,业务功能的实现;关于编程本身的技能都要有些生疏了,于是就选择了几个专题做了一次温习,重点放在了多线程和多进程上,跑了一个实例,居然有新的发现:
(1)多个线程顺序创建的顺序=线程执行顺序吗?
(2)多个线程顺序创建,回调函数执行顺序有规律吗?
示例:
#include "apue.h"
#include <pthread.h> void *
thr_fn1(void *arg)
{
printf("thread 1 returning\n");
return((void *));
} void *
thr_fn2(void *arg)
{
printf("thread 2 exiting\n");
pthread_exit((void *));
} int
main(void)
{
int err;
pthread_t tid1, tid2;
void *tret; err = pthread_create(&tid1, NULL, thr_fn1, NULL);
if (err != )
err_quit("can't create thread 1: %s\n", strerror(err));
/*sleep(1);*/
err = pthread_create(&tid2, NULL, thr_fn2, NULL);
if (err != )
err_quit("can't create thread 2: %s\n", strerror(err));
err = pthread_join(tid1, &tret);
if (err != )
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 != )
err_quit("can't join with thread 2: %s\n", strerror(err));
printf("thread 2 exit code %d\n", (int)tret);
exit();
}
输出:
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
多线程执行顺序诡异现象谈,你不知道的pthread_create的更多相关文章
- pthread_create多线程执行顺序诡异现象
多线程执行顺序诡异现象谈,你不知道的pthread_create 引文:学而时习之,不亦说乎.总是忙于具体项目,业务功能的实现:关于编程本身的技能都要有些生疏了,于是就选择了几个专题做了一次温习,重点 ...
- Android-Java控制多线程执行顺序
功能需求: Thread-0线程:打印 1 2 3 4 5 6 Thread-1线程:打印1 1 2 3 4 5 6 先看一个为实现(功能需求的案例) package android.java; // ...
- Java控制多线程执行顺序
package net.jasonjiang.thread; import java.io.IOException; public class ThreadTestNew { public stati ...
- 浅谈原子操作、volatile、CPU执行顺序
浅谈原子操作.volatile.CPU执行顺序 在计算机发展的鸿蒙年代,程序都是顺序执行,编译器也只是简单地翻译指令,随着硬件和软件的飞速增长,原来的工具和硬件渐渐地力不从心,也逐渐涌现出各路大神在原 ...
- 浅谈SQL优化入门:1、SQL查询语句的执行顺序
1.SQL查询语句的执行顺序 (7) SELECT (8) DISTINCT <select_list> (1) FROM <left_table> (3) <join_ ...
- 浅谈Java语言中try{}catch{}和finally{}的执行顺序问题
浅谈Java语言中try{}catch{}和finally{}的执行顺序问题 2019-04-06 PM 13:41:46 1. 不管有没有出现异常,finally块中代码都会执行: 2. 当t ...
- Java多线程之控制执行顺序
概念: 多线程在并发环境中的正常执行顺序是随机无序的,并不能按照期盼的结果输出. 因为启动一个线程时,线程并不会立即执行,而是等待CPU的资源调度,CPU能调度哪个线程,是通过多种复杂的算法计算而来. ...
- 浅谈循环中setTimeout执行顺序问题
浅谈循环中setTimeout执行顺序问题 (下面有见解一二) 期望:开始输出一个0,然后每隔一秒依次输出1,2,3,4. for (var i = 0; i < 5; i++) { setTi ...
- 【分析】浅谈C#中Control的Invoke与BeginInvoke在主副线程中的执行顺序和区别(SamWang)
[分析]浅谈C#中Control的Invoke与BeginInvoke在主副线程中的执行顺序和区别(SamWang) 今天无意中看到有关Invoke和BeginInvoke的一些资料,不太清楚它们之间 ...
随机推荐
- 比较强大 优秀的开源框架 :Android图片加载与缓存:Android Glide 的用法
使用Android Glide,需要先下载Android Glide的库,Android Glide在github上的项目主页: https://github.com/bumptech/glide . ...
- css 让div 置于最顶层而不被其他东西挡住
今天遇到自己写的div被其他东西给挡住了,需要设置一个属性就成功了 设置:z-index:值:比如 z-index:999. 若值设置为为-1,代表为最底层. div的图层由div的style中的z- ...
- nested exception is java.sql.SQLException: Incorrect string value: '\xE7\x99\xBB\xE9\x99\x86...' for column 'image' at row 1
HTTP Status 500 - Hibernate operation: could not insert: [cn.itcast.shop.product.vo.Product]; uncate ...
- <NET CLR via c# 第4版>笔记 第12章 泛型
泛型优势: 源代码保护 使用泛型算法的开发人员不需要访问算法的源代码.(使用c++模板的泛型技术,算法的源代码必须提供给使用算法的用户) 类型安全 向List<DateTime>实例添加一 ...
- 坏消息:百度影音、快播关闭P2P服务器!
继日前优酷土豆集团.搜狐视频.腾讯视频.乐视网.中国电影著作权协会(MPA).美国电影协会 (MPAA).日本内容产品流通海外促进机构(CODA).万达影业.光线传媒.乐视影业联合发布“中国网络视频反 ...
- sonarqube 代码检查
再好的程序员也会出bug,所以代码检查很有必要.今天就出一个简单的检查工具代替人工检查. 参考: http://www.cnblogs.com/qiaoyeye/p/5249786.html 环境及版 ...
- Ubuntu下安装、卸载notepad++
Ubuntu下的安装方法: sudo add-apt-repository ppa:notepadqq-team/notepadqq sudo apt-get update sudo apt-get ...
- HandBrake 开源视频转码器、编码转换器、格式转换器
HandBrake 开源视频转码器.编码转换器.格式转换器 点击下图进入官网下载页面:https://handbrake.fr/downloads.php macOS 下可能会阻止安装! 其实也不是安 ...
- JAVA取得IP
通常这样取一个IP:request.getRemoteAddr(),但有时候取出来的是不对的,特别是在应用前加了Nginx之类的软件,下面的方法可以取出访问的IP地址 public static St ...
- 对magento MVC框架的了解
对magento MVC框架的了解 在做二次开发以来,一直没有好好地去了解magento的MVC架构,以为跟其它的MVC架构一样,其实有着很大的区别. 有很多的程序框架都使用了现在最流行的MVC架构, ...