文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>linux下利用线程遇到的一个bug

linux下利用线程遇到的一个bug

时间:2010-11-29  来源:shenhailuanma

开门见山,代码如下:

#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,所以在内核里,它看起来就像是一个普通的进程。
    所以,暂时假设为:由于进程退出,主线程和新线程都做了“收尾工作”。
相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载