博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于子线程执行两次的问题
阅读量:4942 次
发布时间:2019-06-11

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

#include
#include
pthread_t ntid;void printids(const char *s){ pid_t pid; pthread_t tid; pid = getpid(); tid = pthread_self(); printf("%s pid %lu tid %lu (0x%lx)\n",s,(unsigned long)pid,\ (unsigned long)tid,(unsigned long)tid);}void * thr_fn(void *arg) { printids("new thread:"); return ((void *)0);}int main(int argc, const char *argv[]){ int err; err = pthread_create(&ntid,NULL,thr_fn,NULL); if(err !=0) { perror("erro"); return 0; } printids("main thread:");// sleep(1); return 0;}

  在运行时会出现3中情况:

1.

main thread: pid 4815 tid 3075843776 (0xb755a6c0)new thread: pid 4815 tid 3075840832 (0xb7559b40)

2.

main thread: pid 4800 tid 3076433600 (0xb75ea6c0)

3.

main thread: pid 4773 tid 3075663552 (0xb752e6c0)new thread: pid 4773 tid 3075660608 (0xb752db40)new thread: pid 4773 tid 3075660608 (0xb752db40)

第一种情况可以理解为:主线程先运行,正要退出的时候,子线程运行了

第二种情况可以理解为:主线程运行完了,并结束了进程,这时子线程还没来的及运行。

第三种情况理解:答案是从网上找到的:https://segmentfault.com/q/1010000003739810?sort=created

首先,这个程序是错误的,在exit()的时候会在stdout上发生竞争。

  你要明白,发生竞争之后出现什么情况都不稀奇,所以不要深究这个原因了,没有意义,这跟stdio的实现相关。

  举个可能的场景满足你的好奇心,比如:

  新线程的printf在写完缓冲区之后执行flush——调用write,再要把已经write过的数据从缓冲区中删掉,但是在删除之前,main线程的exit也要flush stdout,就可能把已经flush过          的数据又flush了一遍。

 

转载于:https://www.cnblogs.com/jiaan/p/9557430.html

你可能感兴趣的文章
并查集
查看>>
11、组件注册-使用FactoryBean注册组件
查看>>
nyoj_95_众数问题_map练习
查看>>
For循环
查看>>
020-安装centos6.5后的生命历程
查看>>
面试介绍项目经验(转)
查看>>
创建并设置ASP.NET的会话状态服务器(SQL State Server)
查看>>
<metro>Google的验证
查看>>
SQL中NUMERIC和DECIMAL的区别
查看>>
安卓课程设计:微课表
查看>>
Oracle 表的分组操作
查看>>
在OS X上的Intllij Idea中配置GlassFish
查看>>
用查表法快速转换yv12到RGB【转】
查看>>
使用公钥登录SSL
查看>>
hdu 1290_献给杭电五十周年校庆的礼物
查看>>
Nginx 入门
查看>>
openCR-用ROS代码点亮LED的方法
查看>>
豆瓣电影api
查看>>
BufferedInputStream和FileInputStream的区别
查看>>
二阶段之六
查看>>