c 多线程 问题

来源:百度知道 编辑:UC知道 时间:2024/05/22 17:05:58
写了个程序大概是这样的:

void run(){
HANDLE hThrd;
DWORD threadID;
int i;
for(i=0;i<5;i++){
hThrd = CreateThread(NULL,0,ThreadFunc,(LPVOID)i,0,&threadID);
if(hThrd) printf("Thread lanching--%d-- ",i);

}
Sleep(2000);

}
运行结果不确定我知道的,但是为什么会出现printf语句执行超过5次的情况呢?
run运行一次呀,printf运行了超过5次,有时候是 001234有时候是01122344,怎么会这样呢
妈呀,竟然还出现了少于5次的情况...
求解
DWORD WINAPI ThreadFunc(LPVOID p){
for(int i=0;i<6;i++)
printf("%d ",p);
return 0;
}
请详细解释,可以另外加分

这还不简单,是没有解决同步的问题。 操作系统执行指令是由时间片组成的。你那个变量i,又没有规定只能一个人访问。第一个线程执行了,i=0,时间片到了,轮到第二个线程执行了,这时i=0,输出来了。然后第一个线程轮到执行了,又是输出0,刚才没有输出。还有就是多核CPU的问题。最重要的就是没有做到线程同步。我只能说到这份上了。
等你学了线程同步,就知道原因所在了。想当初,我也困了好久。

第1个线程传值0,不会有输出
第2个线程传值1,会有1输出
第3个线程传值2,会有2输出
....

按理论应该,按这样的顺序输出
但线程是同步的,输出的顺序会不一样的,有可能3线程先输出1句,然后2线程函数在输出一句这样的。
使用同步技术可以避免这样的问题

是吗?应该不会的 多次调用了run? 建议你单步调试看看

你在if前加 Sleep(2000);看看呢?

线程函数ThreadFunc也有输出吧