| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 641 人关注过本帖
标题:请教高手一个多线程编程的问题
只看楼主 加入收藏
yangjinze
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2011-10-2
结帖率:50%
收藏
已结贴  问题点数:20 回复次数:3 
请教高手一个多线程编程的问题
#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不能执行?
搜索更多相关主题的帖子: ticket 编程 running include 多线程 
2012-02-09 17:40
hahayezhe
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:湖南张家界
等 级:贵宾
威 望:24
帖 子:1386
专家分:6999
注 册:2010-3-8
收藏
得分:10 
不可能吧


我试了很正常啊

再者不就是一直执行么 while(1);就可以了 还i++<10000,而且主线程死循环里应该加个Sleep 把时间片让给其他线程
2012-02-09 18:05
yangjinze
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2011-10-2
收藏
得分:0 
回复 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;
}

2012-02-09 21:02
smallmoon521
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:4
帖 子:517
专家分:1373
注 册:2008-4-21
收藏
得分:10 
我觉得这个应该与机器的属性有关吧
这个程序三个线程: 主(T0), 线程1(T1), 线程2(T2).
我们知道,多线程实际上在某一时刻CPU还是只执行一个线程的代码, 其他线程处理wait状态, 时间片到期后, 转执行其他线程
在main中,开始时T0在执行,然后T0创建T1,T2.
此时T0还在执行,如果T0在执行完后面的while后,时间片还未到期,则程序会退出.
进程退出,则线程销毁.所以T1,T2未得到执行

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

为游戏狂~~!!    大家努力编哈!
2012-02-10 13:40
快速回复:请教高手一个多线程编程的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016235 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved