Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1460426
  • 博文数量: 181
  • 博客积分: 3308
  • 博客等级: 中校
  • 技术积分: 2227
  • 用 户 组: 普通用户
  • 注册时间: 2010-10-03 12:03
个人简介

我是zoro

文章分类

全部博文(181)

文章存档

2015年(1)

2013年(35)

2012年(39)

2011年(50)

2010年(56)

分类: LINUX

2010-11-29 21:16:05

开门见山,代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <string.h>

void *pthread_handler(void *arg)
{
    printf("hello\n");
    return NULL;
}

int main(void)
{
    int ret;
    pthread_t tid;

    ret = pthread_create(&tid,NULL,pthread_handler,NULL);
    if(ret != 0)
    {
        printf("pthread_create:%s\n",strerror(ret));
        exit(1);
    }
    usleep(5);
    return 0;
}

   这个测试代码内容很简单,就是主线程创建一个线程然,主线程usleep一下后退出,线程打印一小段字符串后返回。预期的结果很明显是打印"hello",但结果打印两个"hello",结果如下。

zx@zhangxu:~/lianxi/pthread$ ./test
hello
hello

   很明显可以看出,造成这种结果的主因是usleep,若增大usleep的参数到一定程度,便可得到预期的结果。
    通过修改代码,进行一系列的测试发现:由于自定义的usleep的时间很短暂,若新线程的工作比较多,则造成线程未执行完便退出了,只输出了残缺的结果。当然这种结果也比较容易理解,毕竟进程由于其他的线程而结束了嘛。
   而对于上面的结果,为何要打印两次呢?虽说同族线程共享一个地址空间,但打印两次还是不太理解。
   一般来说,在进程退出时,会冲洗IO缓冲。而且对于linux下的线程,它的实现机制非常独特。从内核的角度来说,它并没有线程这个概念,linux把所有线程当做进程来实现,线程被视为与其他进程空想某些资源的进程。每个线程都拥有唯一隶属于自己的task_struct,所以在内核里,它看起来就像是一个普通的进程。
    所以,暂时假设为:由于进程退出,主线程和新线程都做了“收尾工作”。
阅读(1505) | 评论(1) | 转发(1) |
给主人留下些什么吧!~~

chinaunix网友2010-11-30 10:51:55

很好的, 收藏了 推荐一个博客,提供很多免费软件编程电子书下载: http://free-ebooks.appspot.com