码迷,mamicode.com
首页 > 编程语言 > 详细

linux下多线程踩过的坑(不定更新)

时间:2015-04-05 18:42:44      阅读:157      评论:0      收藏:0      [点我收藏+]

标签:

1,多线程下整个进程的退出

<<APUE>>关于进程环境一章中指出了进程退出的8个条件:

...

(4)最后一个线程从启动例程中返回

(5)最后一个线程调用pthread_exit()返回

...

这些条件一个前提是,主线程在等待子线程返回,若没有等待,则是主线程退出,整个进程直接退出了。其实主线程在等待子线程时,是阻塞到join()上了,最后也是主线程最后退出,整个进程也结束了。

主线程

1 ...
2 {
3 pthread_create(...)
4 //打印 “In the main”
5 sleep(1);
6 }

 

子线程

1 ...
2 {
3 //打印 “I am First”
4 sleep(2);
5 //打印 “I am Second”
6 }

这样子线程中的第二句话,永远也打印不出来;当去掉主线程中的sleep(1)后,子线程中的第一句话有时能打印出来,有时不能打印出来,第二句话永远也打印不出来,其实这里的sleep(1)起到了一个类似join()的作用。

多线程中切记一定要在主线程中join()子线程,也不要对sleep(...)产生任何信任,说不定子线程运行一半就退出了。

 

(2)多线程中的打印函数切记一定是没有输入缓冲的。

当我用cout,fprintf等函数往控制台上输出时,一开始还是正确的,当我不断运行同一个程序时,就会产生问题,有些语句输出了两次,如I am second连续打印了两次,有时候两句话输出到了同一行(就是endl没有起作用),我猜想因为这些函数是带有输入缓冲的。

改用了

1 #include<unistd>
2 size_t write(int filedes, const void* buf, size_t bufsize);

函数后,就没有上面的问题了。

多线程中这种写日志的信息,我想应该用系统不带缓冲的I/O,而别去使用标准库I/O。

 

 

 

linux下多线程踩过的坑(不定更新)

标签:

原文地址:http://www.cnblogs.com/coder-chen/p/4394381.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!