一个简单的线程问题!
#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
作者: grwstc 发布时间: 2011-06-14
作者: VisualEleven 发布时间: 2011-06-14
注不注释都不会出现0
不过不加break不会退出线程
这样不合理
作者: xianglitian 发布时间: 2011-06-14
没自己试过,若真出现你说的问题,不知怎么解释。。。
作者: grwstc 发布时间: 2011-06-14
不加else break;你count ==0时怎么退出的。。。。
他还就真退出了,是不是因为主线程sleep18秒之后退出了,所以相关线程也退出了?
作者: ShiDaJi 发布时间: 2011-06-15
我试了一下
注不注释都不会出现0
不过不加break不会退出线程
这样不合理
如果不加break的话,线程就不会退出,但是由于主线程sleep之后退出所以其他线程也会退出是吧?不过有什么不合理的么?这样做有什么不好的地方么?
作者: ShiDaJi 发布时间: 2011-06-15
作者: grwstc 发布时间: 2011-06-16
主线程退出,整个进程结束,所有子线程强制结束
作者: kyotrue 发布时间: 2011-06-16
这句决定了不会出现打印0的情况。
不加BREAK会使两个线程进入无SLEEP的死循环,不可取。
作者: mengfeihong 发布时间: 2011-06-16
作者: flydreamGG 发布时间: 2011-06-16
引用 3 楼 xianglitian 的回复:
我试了一下
注不注释都不会出现0
不过不加break不会退出线程
这样不合理
如果不加break的话,线程就不会退出,但是由于主线程sleep之后退出所以其他线程也会退出是吧?不过有什么不合理的么?这样做有什么不好的地方么?
你这个程序比较小
功能简单
所以这么处理没有什么问题
但是一个良好的编程习惯应该是主线程应该等待所有子线程结束之后再结束自己
而不是自己退出后由系统去料理后事
这样做是很不负责的编程方式
作者: xianglitian 发布时间: 2011-06-16