多线程程序,代码输出不正确,
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
------解决方案--------------------
------解决方案--------------------pthread_create(&p[i],NULL,thread_function,&i);
你把main函数栈上的一个int i的地址告诉了所有线程, 当然就是访问同一个int啊, C语言基础功啊。
------解决方案--------------------其实加了sleep也不是百分百保证上一个线程已经运行的...
多线程要时刻考虑并发问题。
------解决方案--------------------再多说一句,加了sleep输出结果也不一定每次都一样.
------解决方案--------------------