疑惑!!关于线程问题的!请高手帮忙!

K_BUKER 2004-10-13 08:22:44
前两天我在论坛上问了一个用C++编写一个多线程程序的问题, hcj2002(流浪者·躬自厚而薄责于人)不吝赐教,给了下面这个这个程序,在此我对他非常地感谢。程序后来我也调试过,也调通了,只是对其中一些地方不太理解,在此想跟CSDN中的各位高手一起探讨探讨,如果 hcj2002(流浪者·躬自厚而薄责于人)本人能再赐教,那更是不胜感激!
hcj2002(流浪者·躬自厚而薄责于人)给的源程序如下:
#include<windows.h>
#include<process.h>
#include<iostream.h>
#include<stdio.h>

void DisplayEven( void );
void DisplayOdd( void );

int main ( void )
{
HANDLE thd1,thd2;
DWORD tid1,tid2;
char c;

thd1=CreateThread( NULL, 0, (LPTHREAD_START_ROUTINE)DisplayEven, NULL, 0,&tid1);
thd2=CreateThread( NULL, 0, (LPTHREAD_START_ROUTINE)DisplayOdd, NULL, 0, &tid2);

cout<<"Please press 0 to EXIT !!!"<<endl;
c=getchar();
if( c == 0 )
{

if( thd1 != NULL)
{
CloseHandle( thd1 );
}
if( thd2 != NULL)
{
CloseHandle( thd2 );
}
}
return 0;
}

void DisplayEven( void )
{
int i=0;
while( i<20 )
{
cout<<" "<<i<<endl;
i=i+2;
Sleep( 2000 );
}
}

void DisplayOdd( void )
{
int i=1;
while( i<20 )
{
// cout<<endl;
cout<<" "<<i<<endl;
i=i+2;
Sleep( 2000 );
}
}
首先,程序运行时输入0并不会停止,我想这应该是if()的问题,对c定义的是char型,但这句if(c==0)我想并没有起多少作用;在判断句柄不为null这句中if( thd1 != NULL),= 号和!= 的作用是一样的,并没有对程序的运行起到影响,不知为何;主函数定义成int与定义成void也不会有任何影响不知为何,(不过我想这应该不成问题,呵呵);还有,windows.h这个头文件中关于线程的函数都有哪些阿?它们的用法都是怎样的?
...全文
128 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
K_BUKER 2004-10-14
  • 打赏
  • 举报
回复
谢谢各位!让我学到不少东西!
248406869(笨笨) 说得没错,0是没办法从控制台输入的,理论上来说,输入0时应该使整的线程停止,我不知是不是我的编译器的问题,总之输入0没作用,而如果说要敲回车才会停止的话,那不用输入0直接敲回车也会停止。而且改成if (c == ' 0'),将0作为一个字符形式输入,同样没有作用。通俗的讲,线程是一个前台与后台同时进行过程,除了用CreateThread()函数来创建一个线程外,还有没有其他的办法能够更直观更形象的描述出线程的具体运行过程?还有,在这个程序中用了两个CreateThread()函数创建了两个线程,同样的方法可以创建三个以及更多的线程一起运行,我想知道一般的编译器能够承受多少个线程?Sleep()函数中给定的值,即是线程的响应时间,一般怎么设定才科学?是根据什么来设定的?
248406869 2004-10-14
  • 打赏
  • 举报
回复
结束线程可以使用TerminateThread,这是最差的方法,你不知道线程执行到了什么地方,所以是危险的。结束后线程的栈空间不被释放。
hjf1223 2004-10-14
  • 打赏
  • 举报
回复
这点倒是没发现,可以这样嘛,if (c == '0') 或 c==48不就可以了?别外线程也不一定要从本身退出,也可以用其它方式。不过这种方式是最好的
248406869 2004-10-14
  • 打赏
  • 举报
回复
c=getchar();
if( c == 0 )
你输入0的时候c的值并不是0而是48,0从控制台是没有办法输入的。CloseHandle并不是结束线程,线程只能从线程中退出。
hjf1223 2004-10-14
  • 打赏
  • 举报
回复
上面的分析没发现,这个程序按0也会马上关闭,因为c=getchar();在等用户输入,如果输入后,系统继续往下执行,然后执行return 0程序就结束了!这时候关闭的是整个进程,也就是主线程已经返回了,子线程当然就结束了。把上面的程序改成如下,不管你怎么输入多少次的0,线程还是照样在执行的。
thd1=CreateThread( NULL, 0, (LPTHREAD_START_ROUTINE)DisplayEven, NULL, 0,&tid1);
thd2=CreateThread( NULL, 0, (LPTHREAD_START_ROUTINE)DisplayOdd, NULL, 0, &tid2);

cout<<"Please press 0 to EXIT !!!"<<endl;
while(TRUE)
{
c=getchar();
if( c == 0 )
{
if( thd1 != NULL)
{
CloseHandle( thd1 );
}
if( thd2 != NULL)
{
CloseHandle( thd2 );
}
}
}
return 0;
以上程序一直输入数据,直到线程结束,试试看。
hcj2002 2004-10-13
  • 打赏
  • 举报
回复
呵呵,以前照着书上自己改的一个程序,所以有很多问题:(

不过在我这里输入0 回车,确实可以关闭程序。



hjf1223 2004-10-13
  • 打赏
  • 举报
回复
thd1=CreateThread( NULL, 0, (LPTHREAD_START_ROUTINE)DisplayEven, NULL, 0,&tid1);
thd2=CreateThread( NULL, 0, (LPTHREAD_START_ROUTINE)DisplayOdd, NULL, 0, &tid2);
首先这两个函数创建的线程返回它们的句柄,然后这个句柄并不会影响它们的运行状态,它们的作用是标识这两个线程,就像人一样,出生要给它的一个名字(或代号)这样便于别人叫它,然后有没有这个代号对它本身没有多大的影响,没有名字它照样活着。关闭句柄并没有结束线程,在这个程序里,线程会是通过函数执行结束来返回的,(不知道你发现了没有至少要到2*20秒的时间。)这是一点。主函数的返回值没有影响。关于线程的函数有很多,有关于线程的同步,控制,还有很多,你可以去看《windows核心编程》

33,317

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧