一个简单的线程问题!

C/C++ code
#include <Windows.h>
#include <stdio.h>
#include <iostream>
using namespace std;
int count=100;
HANDLE hMutex=CreateMutexW(NULL,false,NULL);
DWORD WINAPI Thread1(__in  LPVOID lpParameter)
{
    while (true)
    {
        if (count>0)
        {
            WaitForSingleObject(hMutex,INFINITE);
            cout<<"Thread1 is running"<<endl;
            cout<<count<<endl;
            count--;
            ReleaseMutex(hMutex);
            Sleep(100);
        }
        //else break;
    }


    return 0;
}
DWORD WINAPI Thread2(__in  LPVOID lpParameter)
{
    while (true)
    {
        if (count>0)
        {
            WaitForSingleObject(hMutex,INFINITE);
            cout<<"Thread2 is running"<<endl;
            cout<<count<<endl;
            count--;
            ReleaseMutex(hMutex);
            Sleep(100);    
        }
        //else break;
        
    }


    return 0;
}

void main(){
    HANDLE hThread1=CreateThread(NULL,0,Thread1,NULL,0,NULL);
    HANDLE hThread2=CreateThread(NULL,0,Thread2,NULL,0,NULL);
    cout<<"Main Thread is running"<<endl;
    Sleep(18000);

}

源代码是这样的,在两个线程中,如果把else breadk;的注释去掉的话就不会出现count为0的情况,但是如果不加这句的话就会出现count为0的情况,麻烦给解释一下这是为啥?

作者: ShiDaJi   发布时间: 2011-06-14

不加else break;你count ==0时怎么退出的。。。。

作者: grwstc   发布时间: 2011-06-14

count为0的时候就退出while循环了

作者: VisualEleven   发布时间: 2011-06-14

我试了一下
注不注释都不会出现0
不过不加break不会退出线程
这样不合理

作者: xianglitian   发布时间: 2011-06-14

要是我遇到这个问题,就把count定为1和0测试一下,不行就把条件改为count>=1,再不行count定义为static。。。

没自己试过,若真出现你说的问题,不知怎么解释。。。

作者: grwstc   发布时间: 2011-06-14

引用 1 楼 grwstc 的回复:
不加else break;你count ==0时怎么退出的。。。。

他还就真退出了,是不是因为主线程sleep18秒之后退出了,所以相关线程也退出了?

作者: ShiDaJi   发布时间: 2011-06-15

引用 3 楼 xianglitian 的回复:
我试了一下
注不注释都不会出现0
不过不加break不会退出线程
这样不合理

如果不加break的话,线程就不会退出,但是由于主线程sleep之后退出所以其他线程也会退出是吧?不过有什么不合理的么?这样做有什么不好的地方么?

作者: ShiDaJi   发布时间: 2011-06-15

没看到18000.。。。不好的地方好像是,要是线程函数18秒内没完成也会结束哦

作者: grwstc   发布时间: 2011-06-16

有else break,count为0线程函数就退出了,当然就一直为0了;你把它注释了,就会一直减成负啊。

主线程退出,整个进程结束,所有子线程强制结束

作者: kyotrue   发布时间: 2011-06-16

if (count>0)
这句决定了不会出现打印0的情况。
不加BREAK会使两个线程进入无SLEEP的死循环,不可取。

作者: mengfeihong   发布时间: 2011-06-16

你能把输出结果贴一下吗?是不是=0在线程切换时出现的?

作者: flydreamGG   发布时间: 2011-06-16

引用 6 楼 shidaji 的回复:

引用 3 楼 xianglitian 的回复:
我试了一下
注不注释都不会出现0
不过不加break不会退出线程
这样不合理

如果不加break的话,线程就不会退出,但是由于主线程sleep之后退出所以其他线程也会退出是吧?不过有什么不合理的么?这样做有什么不好的地方么?

你这个程序比较小
功能简单
所以这么处理没有什么问题
但是一个良好的编程习惯应该是主线程应该等待所有子线程结束之后再结束自己
而不是自己退出后由系统去料理后事
这样做是很不负责的编程方式

作者: xianglitian   发布时间: 2011-06-16