现在的位置: 首页 > 综合 > 正文

(疑问已经解决了)求解答疑问,关于多线程的(没有人回答,我自己解决问题吧,二和三疑问已解决,第一个疑问扔没有解决)

2014年01月12日 ⁄ 综合 ⁄ 共 3243字 ⁄ 字号 评论关闭

从疑问一往下是提问,刚开始是提问总结

自己动手丰衣足食,我上网搜索,看到别人的帖子http://bbs.csdn.net/topics/80042538,我的2和3问题都好理解了,因为主线程结束了,子线程也会也结束了,所以说,第二个疑问中是因为主线程结束了,所以子线程也不执行任务了,第三个实验中,当主线程还在执行,子线程也会照旧。同时,我二三疑问也论证了,主线程结束了,子线程也会结束。

对于疑问一,还得继续寻找。

疑问一终于找到答案了,其实,与二三疑问是同根同源的

这个问题,的确是主线程与子线程生存期有关,主线程结束了,不管子线程是否有任务,整个程序都会结束
今天我重新做了下关于怎么去sleep的实验
先把第一个sleep去掉,这时主线程睡眠300ms了,对于执行完两个子线程是完全够的,如果我再把时间改成10,5都是可以的,再改成1ms,仍然是可以执行完全的,我再把主线程的两个else
cout<<"Thread1 successfully!"<<endl;都去掉,这个时候两个子线程执行时不完全的,同时,这个else
cout<<"Thread1 successfully!"<<endl;也是挺耗时间的,所以能把两个子进程能执行完
再把第二个sleep去掉,现象是只执行了第一个线程。我觉得是这时执行第一个子线程能执行完,主线程还在睡眠,主线程开始执行的时候,已经执行完了,所以说这个第二个子线程有可能不能执行。

如果吧两个sleep都去掉,可能会执行,但执行不会玩,可能会执行完,else
cout<<"Thread1 successfully!"<<endl;这个主线程会消耗一定的时间的,如果这是再把这两个else
cout<<"Thread1 successfully!"<<endl;,那就两个子线程就完全不能执行了。
所以说,这归根结底,想要子线程执行,还是要让主线程的生存周期足够长。



疑问一:关于多线程是否执行的问题,跟sleep函数相关,这有点疑惑,sleep函数是线程休眠,下面的代码就是主线程休眠,线程1执行,主线程恢复,再休眠,线程2执行,

如果去掉任意一个sleep函数,只会执行一个线程,这是为什么?

先看直接上代码:

#include "iostream"
#include "windows.h"
using namespace std;

DWORD WINAPI ThreadProc1(LPVOID lpParam);
DWORD WINAPI ThreadProc2(LPVOID lpParam);
HANDLE hEvent = NULL;
HANDLE hThread1 = NULL;
HANDLE hThread2 = NULL;
int main(int argc, char *args[])
{
	hEvent = CreateEvent(NULL, TRUE, TRUE, NULL); //使用手动重置为无信号状态,初始化时有信号状态
	//hEvent = CreateEvent(NULL, FALSE, TRUE, NULL); //当一个等待线程被释放时,自动重置为无信号状态,初始是有信号状态
	//if (SetEvent(hEvent))
	//{
	//	cout << "setEvent 成功" <<endl;
	//}
	hThread1 = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ThreadProc1, NULL, 0,NULL);
	Sleep(200);
	hThread2 = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ThreadProc2, NULL, 0,NULL);
	Sleep(200);
	if ( NULL == hThread1)
	{
		cout <<"create thread1 fail!"<<endl;
	}
	else
		cout<<"Thread1 successfully!"<<endl;
	if ( NULL == hThread2)
	{
		cout <<"create thread2 fail!";
	}
	else
		cout<<"Thread2 successfully!"<<endl;
	//DWORD dCount = ResumeThread(hThread);
	//cout << LOWORD(dCount) << endl;
	return 0;
}
DWORD WINAPI ThreadProc1(LPVOID lpParam)
{
	cout <<"in thread1@!"<<endl;
	
	DWORD dReturn = WaitForSingleObject(hEvent,INFINITE);
	
	if ( WAIT_OBJECT_0 == dReturn)
	{
		cout <<" thread1 signaled ! "<<endl;
	}
	cout <<"in thread1 --signal"<<endl;
	
	//SetEvent(hEvent);
	return 0;
}
DWORD WINAPI ThreadProc2(LPVOID lpParam)
{
	cout <<"in thread2@!"<<endl;
	
	DWORD dReturn = WaitForSingleObject(hEvent,INFINITE);
	
	if ( WAIT_OBJECT_0 == dReturn)
	{
		cout <<"thread2 signaled ! "<<endl;
	}
	cout <<"in thread2--signal"<<endl;
	
	return 0;
}

执行结果无错,但是当去掉任意一个Sleep(200)就有一个线程不能执行,这是为什么

疑问二:关于CloseHandle()这个函数,这个函数只是关闭了句柄,对以后的线程没有影响。

下面的代码是我做了个小实验,关闭了句柄,应该线程一直执行,不会结束

如果我改动一下,就会出现问题,想知道为什么?

HANDLE hThread;
DWORD WINAPI Proc(LPVOID lpParam)
{
	int i=0;
	while(11)
		;
	printf("hello %d!\n",i++);
	return 0;
}

void main()
{
	if((hThread=CreateThread(NULL,0,Proc,NULL,NULL,0))==NULL)
		printf("Create thread failed!\n");
	if(CloseHandle(hThread))
		printf("close sucessfully!\n");
	else
		if(GetLastError()==ERROR_INVALID_HANDLE)
			printf("false!\n");
}


如果我把这

	while(11)
		;
	printf("hello %d!\n",i++);

三行改成

	while(11)
	printf("hello %d!\n",i++);

线程并没有一直执行,只打印了一次hello0

这是为什么?求解惑

疑问三:我又在main函数加了点东西,代码如下,这样的话才说明CloseHandle()函数并没有影响线程的执行,同时,也出现另外一个问题是,当主线程没有任务执行时,不管线程是否有任务,那这个程序结束了吗?

#include <windows.h>
#include <stdio.h>
HANDLE hThread;
DWORD WINAPI Proc(LPVOID lpParam)
{
	int i=0;
	while(11)
		printf("hello %d!\n",i++);
	return 0;
}

void main()
{
	if((hThread=CreateThread(NULL,0,Proc,NULL,NULL,0))==NULL)
		printf("Create thread failed!\n");
	if(CloseHandle(hThread))
		printf("close sucessfully!\n");
	else
		if(GetLastError()==ERROR_INVALID_HANDLE)
			printf("false!\n");
	while(1)
		;
}


感觉有点奇怪~~~

求大神解释

抱歉!评论已关闭.