开门见山,代码如下:
#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,所以在内核里,它看起来就像是一个普通的进程。
所以,暂时假设为:由于进程退出,主线程和新线程都做了“收尾工作”。
阅读(1561) | 评论(1) | 转发(1) |