首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 操作系统 > UNIXLINUX >

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

2012-03-02 
多线程程序,代码输出不正确,C/C++ code#include stdio.h#include pthread.h#include stdlib.h#inclu

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

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输出结果也不一定每次都一样.


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

热点排行