日期:2014-05-16  浏览次数:20854 次

多线程程序,代码输出不正确,
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输出结果也不一定每次都一样.


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