Chinaunix
标题:
问一段 APUE 上关于线程部分的代码
[打印本页]
作者:
tanggula2007
时间:
2010-08-19 22:32
标题:
问一段 APUE 上关于线程部分的代码
本帖最后由 tanggula2007 于 2010-08-19 22:35 编辑
问题是这样的:
按照书上所说(APUE(第2版) 中文版 Page:290 ),为了避免主线程退出,造成新创建的线程未能执行完,整个进程就退出,因此在主线程中使用了 sleep(1) 函数,
这一点我能明白。但是,假如现在我将 sleep(1)注释掉,执行编译出的结果时,会出现三种情况
1.主线程执行完毕,直接退出,新创建的线程未能执行完,只打印出主线程的信息;
2.主线程和新线程都执行完毕,两个线程的信息都打印出来了;
以上两种情况,我都能理解
3.除了打印出第2种情况的信息以外,新创建的线程的信息会再次打印一遍
搞不懂这是为什么?望高人出来指点指点
代码贴出来
#include <pthread.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
pthread_t ntid;
void
printids(const char *s)
{
pid_t pid;
pthread_t tid;
pid = getpid();
tid = pthread_self();
printf("%s pid %u tid %u (0x%x)\n", s, (unsigned int)pid, (unsigned int)tid, (unsigned int)tid);
}
void *
thr_fn(void *arg)
{
printids("new thread: ");
return((void *)0);
}
int
main(void)
{
int err;
err = pthread_create(&ntid, NULL, thr_fn, NULL);
if(err != 0)
printf("can't create thread : %s\n", strerror(err)); //这里没有使用书上的由作者定义的出错函数
printids("main thread:");
// sleep(1); //故意注释了原来的代码
exit(0);
}
复制代码
gcc编译时需加上 "-lpthread"
作者:
liexusong
时间:
2010-08-19 23:53
好像我运行了很多次都没有子线程运行2次的啊~
作者:
奶茶dsk
时间:
2010-08-20 00:24
是不是printf的问题,这个函数原本是不可重入的,
作者:
tanggula2007
时间:
2010-08-20 01:25
回复
2#
liexusong
我运行的时候
我描述的三个情况都出现过啊
作者:
davelv
时间:
2010-08-20 08:49
当我在main()函数里面用pthread_join把子线程合并的时候,一切不确定性就消失了。
出现两次newthread的原因我猜是因为。。。猜不到,某非是默认的线程清理函数在搞鬼?
作者:
phy0077
时间:
2010-08-20 09:39
本帖最后由 phy0077 于 2010-08-20 09:44 编辑
貌似你无法确定子线程的printf是否执行完了。这个是行缓冲的,如果你保证printf执行完毕,就不应该会出现第三种情况了。
sleep也不是这么用的,不应该做这种假设
作者:
tanggula2007
时间:
2010-08-20 10:41
回复
6#
phy0077
这不是 拿来做产品的代码 只是APUE上的,我只是好奇为什么会出现第三种情况,
况且这也不是我的假设,运行的时候的确出现了第三种情况
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2