注册 登录
编程论坛 VC++/MFC

请教高手一个多线程编程的问题

yangjinze 发布于 2012-02-09 17:40, 641 次点击
#include<windows.h>
#include<iostream.h>

DWORD WINAPI Fun1Proc(LPVOID lpParameter);
DWORD WINAPI Fun2Proc(LPVOID lpParameter);
int i=0;
int ticket=100;
void main()
{
HANDLE hThread1;
HANDLE hThread2;
hThread1=CreateThread(NULL,0,Fun1Proc,NULL,0,NULL);
hThread2=CreateThread(NULL,0,Fun2Proc,NULL,0,NULL);
CloseHandle(hThread1);
CloseHandle(hThread2);
while(i++<10000)
{
cout<<"main is running"<<endl;
}
}

DWORD WINAPI Fun1Proc(LPVOID lpParameter)
{
    while(i++<10000)
    {
    while(1)
    {
    if(ticket>0)
        cout<<"thread1 sell ticket: "<<ticket--<<endl;
    else
        break;
    }}
    return 0;
}

DWORD WINAPI Fun2Proc(LPVOID lpParameter)
{
    while(1)
    {
if(ticket>0)
        cout<<"thread2 sell ticket: "<<ticket--<<endl;
else
break;
    }
return 0;
}这个程序中,不采用Sleep()函数而采用while循环来使主函数不会那么早结束,但为什么主函数中改成//cout<<"main is running"<<endl;,注释起来,则线程1,2都不会执行了?
若不注释,将线程1中去掉任何一个循环,为什么也会导致线程1,2不能执行?
3 回复
#2
hahayezhe2012-02-09 18:05
不可能吧


我试了很正常啊

再者不就是一直执行么 while(1);就可以了 还i++<10000,而且主线程死循环里应该加个Sleep 把时间片让给其他线程
#3
yangjinze2012-02-09 21:02
回复 2楼 hahayezhe
但是你把主函数中while循环改为while(i++<10000)
{
//cout<<"main is running"<<endl;
}
就不可以了呀?
还有为什么while内要加sleep(),
我的意思是while(i++<10000){};这个函数应该足够主函数时间片结束而转到执行子线程;

因为下面这个函数是可以的哦
#include<windows.h>
#include<iostream.h>

DWORD WINAPI Fun1Proc(LPVOID lpParameter);
int i=0;
void main()
{
 HANDLE hThread1;
hThread1=CreateThread(NULL,0,Fun1Proc,NULL,0,NULL);
CloseHandle(hThread1);
while(i++<10000)
{
cout<<"main is running"<<endl;
}
}

DWORD WINAPI Fun1Proc(LPVOID lpParameter)
{
    while(i++<10000)
   {
            cout<<"Thread is running "<<endl;
    }
        return 0;
}

#4
smallmoon5212012-02-10 13:40
我觉得这个应该与机器的属性有关吧
这个程序三个线程: 主(T0), 线程1(T1), 线程2(T2).
我们知道,多线程实际上在某一时刻CPU还是只执行一个线程的代码, 其他线程处理wait状态, 时间片到期后, 转执行其他线程
在main中,开始时T0在执行,然后T0创建T1,T2.
此时T0还在执行,如果T0在执行完后面的while后,时间片还未到期,则程序会退出.
进程退出,则线程销毁.所以T1,T2未得到执行

而Sleep函数是让线程立即睡眠, 结束时间片, 这样,T1,T2即有机会得到执行.
1