读书人

多线程程序,代码输出不正确,该如何解决

发布时间: 2012-03-02 14:40:29 作者: rapoo

多线程程序,代码输出不正确,

C/C++ code
#include <stdio.h>#include <pthread.h>#include <stdlib.h>#include <unistd.h>void *thread_function(void *arg);int main(void){    pthread_t p[5];    int i;    for(i=0;i<5;i++){        pthread_create(&p[i],NULL,thread_function,&i);        sleep(1);    }    for(i=0;i<5;i++)        pthread_join(p[i],NULL);    return 0;}void *thread_function(void *arg){    printf("%d\n",*(int*)arg);    pthread_exit(0);}


直接运行上面的代码.结果是正确的输出01234.但是如果是把第一个for里面的sleep去掉的话.那么输出的结果就不定了.而且会出现重复.这到底是怎么回事呢?

[解决办法]
并发性

回复内容太短了!
[解决办法]
线程被创建以后,被调度的时候不一定,先创建的不一定先被调度
sleep(1)之所以正确,是1s足够长,上一次被创建的线程在下一个线程创建之时肯定被调度到了
[解决办法]
系统默认采取基于时间片轮转的调度策略

更多参考:
http://blog.csdn.net/harry_lyc/article/details/6055734
[解决办法]
探讨

线程被创建以后,被调度的时候不一定,先创建的不一定先被调度
sleep(1)之所以正确,是1s足够长,上一次被创建的线程在下一个线程创建之时肯定被调度到了

[解决办法]
pthread_create(&p[i],NULL,thread_function,&i);

你把main函数栈上的一个int i的地址告诉了所有线程, 当然就是访问同一个int啊, C语言基础功啊。
[解决办法]
其实加了sleep也不是百分百保证上一个线程已经运行的...
多线程要时刻考虑并发问题。
[解决办法]
再多说一句,加了sleep输出结果也不一定每次都一样.
[解决办法]
探讨
引用:

再多说一句,加了sleep输出结果也不一定每次都一样.


能解释一下这是为什么呢?

读书人网 >UNIXLINUX

热点推荐