请帮我看看这个是怎么回事!关于线程方面的。

yuchengliu 2005-03-22 12:18:16
我写了一个线程的测试程序,但是输出很奇怪。
请帮我看看。

#include <iostream>
#include <windows>
#include <process>
using namespace std;
static long count1=0;
static long count2=0;
HANDLE hThread1;
DWORD ThreadID1;
HANDLE hThread2;
DWORD ThreadID2;
DWORD ExitCode;
BOOL bThread1=false;
BOOL bThread2=false;
VOID fun(VOID );
void fun2(void);

void main()
{
HANDLE hThread1;
DWORD ThreadID1;
HANDLE hThread2;
DWORD ThreadID2;
DWORD ExitCode;
if( hThread1=CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)fun, NULL, 0, &ThreadID1))
bThread1=true;
if(hThread2=CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)fun2, NULL, 0, &ThreadID2))
bThread2=true;

//cout<<ThreadID<<endl;
while(bThread1||bThread2)
{ //if(count1>=5)
// {
//GetExitCodeThread(hThread1, &ExitCode);
//ExitThread(ExitCode);
//TerminateThread(hThread1, ExitCode);
//CloseHandle(hThread1);
// cout<<hThread1<<endl;
// }

// if(count2>=10)
// {
//GetExitCodeThread(hThread2, &ExitCode);
// ExitThread(ExitCode);
//TerminateThread(hThread2, ExitCode);
//CloseHandle(hThread2);
//cout<<hThread2<<endl;
// }


}


}

VOID fun(VOID )
{
while(1)
{
if(count1==5)
{

GetExitCodeThread(hThread1, &ExitCode);
bThread1=false;
//CloseHandle(hThread1);
ExitThread(ExitCode);
}
count1++;
cout<<"fun1 runing "<<count1<<endl;
Sleep(100);
}
}

void fun2(void)
{
while(1)
{ if(count2==5)
{
GetExitCodeThread(hThread2, &ExitCode);
bThread2=false;
//CloseHandle(hThread2);
ExitThread(ExitCode);
}
count2++;
cout<<"fun2 runing "<< count2 <<endl;
Sleep(100);
}
}

当fun() fun2()里的count1,count2 取小于9的值可以运行出预想的结果
如下:
fun1 runing 1
fun2 runing 1
fun1 runing 2
fun2 runing 2
fun1 runing 3
fun2 runing 3
fun1 runing 4
fun2 runing 4
fun1 runing 5
fun2 runing 5
请按任意键继续. . .


但是当大于或是等于9的时候。因改是正好等于9的时候
fun1 runing 1
fun2 runing 1
fun1 runing 2
fun2 runing 2
fun1 runing 3
fun2 runing 3
fun1 runing 4
fun2 runing 4
fun1 runing 5
fun2 runing 5
fun1 runing 6
fun2 runing 6
fun1 runing 7
fun2 runing 7
fun1 runing 8
fun2 runing 8
fun1 runing 99fun2 runing 9

fun2 runing 10
fun1 runing 10
请按任意键继续. . .
我用的是Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
请帮我看看,谢谢!
我回家,回来给分!
...全文
114 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
yuchengliu 2005-03-24
  • 打赏
  • 举报
回复
我不是在VC中
我是在我用的是Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland

fun1 runing fun2 runing1
1
fun1 runing 2
fun2 runing2
fun1 runing fun2 runing3
3
fun2 runing4
fun1 runing 4
fun2 runing5
fun1 runing 5
fun2 runing6
fun2 runing7
fun2 runing8
fun2 runing9
fun2 runing10
请按任意键继续. . .
这个是我在DEV-C++中的结果
我就是想知道为什么会这个样子!
yuchengliu 2005-03-22
  • 打赏
  • 举报
回复
自己先顶一下!
WingForce 2005-03-22
  • 打赏
  • 举报
回复
楼上的正确
gnixemos 2005-03-22
  • 打赏
  • 举报
回复

#include <iostream>
#include <windows.h>
#include <process.h>
using namespace std;

static long count1=0;
static long count2=0;
HANDLE hThread1;
DWORD ThreadID1;
HANDLE hThread2;
DWORD ThreadID2;
DWORD ExitCode;
BOOL bThread1=false;
BOOL bThread2=false;

CRITICAL_SECTION cs;

VOID fun(VOID );
void fun2(void);

void main()
{
HANDLE hThread1;
DWORD ThreadID1;
HANDLE hThread2;
DWORD ThreadID2;
DWORD ExitCode;

InitializeCriticalSection(&cs);

if( hThread1=CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)fun, NULL, 0, &ThreadID1))
bThread1=true;
if(hThread2=CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)fun2, NULL, 0, &ThreadID2))
bThread2=true;

//cout<<ThreadID<<endl;
while(bThread1||bThread2)
{ //if(count1>=5)
// {
//GetExitCodeThread(hThread1, &ExitCode);
//ExitThread(ExitCode);
//TerminateThread(hThread1, ExitCode);
//CloseHandle(hThread1);
// cout<<hThread1<<endl;
// }

// if(count2>=10)
// {
//GetExitCodeThread(hThread2, &ExitCode);
// ExitThread(ExitCode);
//TerminateThread(hThread2, ExitCode);
//CloseHandle(hThread2);
//cout<<hThread2<<endl;
// }


}


}

VOID fun(VOID )
{
while(1)
{
if(count1==5)
{

GetExitCodeThread(hThread1, &ExitCode);
bThread1=false;
//CloseHandle(hThread1);
ExitThread(ExitCode);
}
count1++;
EnterCriticalSection(&cs);
cout<<"fun1 runing "<<count1<<endl;
LeaveCriticalSection(&cs);
Sleep(100);
}
}

void fun2(void)
{
while(1)
{ if(count2==5)
{
GetExitCodeThread(hThread2, &ExitCode);
bThread2=false;
//CloseHandle(hThread2);
ExitThread(ExitCode);
}
count2++;
EnterCriticalSection(&cs);
cout<<"fun2 runing "<< count2 <<endl;
LeaveCriticalSection(&cs);
Sleep(100);
}
}
gnixemos 2005-03-22
  • 打赏
  • 举报
回复
最好保护以下输出

输出比较慢

当5的时候,也没有错


fun1 furnu2ni rngun in1
g 1
ffuunn12 rruunniinngg 22

ffuunn12 rruunniinngg 33

ffuunn12 rruunniinngg 44

ffuunn12 rruunniinngg 55



gnixemos 2005-03-22
  • 打赏
  • 举报
回复
这个写法不规范
在vc中cout<<时候发生context switch,输出

fun1 frununin2 g ru 1ni
ng 1
fun1 runing 2
fun2 runing 2
fun1 runing 3
fun2 runing 3
fun1 runing 4
fun2 runing 4
fun1 runing 5
fun2 runing 5
fun1 runing 6
fun2 runing 6
fun1 runing 7
fun2 runing 7
fun1 runing 8
fun2 runing 8
fun1 runing 9
fun2 runing 9
chunhai12 2005-03-22
  • 打赏
  • 举报
回复
去BCB版

64,266

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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