首先看看下面的代码:
#include <windows.h>
#include <iostream>
using namespace std;
DWORD WINAPI FunProc(
LPVOID lpParaneter
);
void main()
{
HANDLE thread1;
thread1 = CreateThread(NULL,0,FunProc,NULL,0,NULL);
// Sleep(10);
CloseHandle(thread1);
cout << "主线程运行!" << endl;
// getchar();
}
DWORD WINAPI FunProc(
LPVOID lpParaneter
){
cout << "子线程运行!" << endl;
return 0;
}
看到上面的代码,先说说运行的结果,如果注释掉sleep函数和getchar()函数,那么可能有一种输出情况是:
这个说明,主线程运行结束后,子线程没有机会执行就结束了,因为整个进程结束了。。
于是就必须要sleep函数,暂停主线程的执行,而等待子线程有时间运行了,但是,结果却是:如果在sleep的时间内,子线程没有执行或者执行完,子线程还是可能没有执行,或者执行到一半的时候和父线程进行抢夺资源,于是出现了很多的情况,比如出现一个感叹号,或者两个交叉输出等等。
现在,我想测试下多个这样的程序同时执行的结果,于是写了有趣的代码:
#include <windows.h>
#include <iostream.h>
void main()
{
int i = 0;
for(; i < 10; i++)
ShellExecute(NULL, NULL, "D:\\Chapter 10\\test1\\Debug\\test1.exe", NULL, NULL, SW_SHOWNORMAL);
}
通过ShellExecute函数来实现让这个程序执行10次,不用总是点击来执行了,而且,发现了有趣的现象。
可以看到执行10次的结果,出现了乱码,竞争资源的危害如此之大!而且,有几次是恰好可以正常的有序执行,不过结果却不是很多,竞争属多数情况!
于是,这个告一段落。
看看这里面用到的函数:
1.CreateThread,查API,功能很简单,创建一个线程。其中大部分参数可以置为空,不过有一点需要注意的就是那个函数参数,它就是子线程的调用函数。
2.CloseHandle,关闭一个打开对象的句柄,实际上句柄就是一个void *的类型对象。
3.控制台下面,很多句柄什么的都可以从简,直接用NULL或者0即可。
4.原型的话照套,很多都是需要。
5.ThreadProc函数,就是调用新的线程的函数。原型都是DWORD ThreadProc(LPVOID lpParameter);
附:换成了英文的话,竞争资源的现象就不会出现乱码了,(个人觉得可能和汉字的机内码表示的解析有关)看看下面的这个截图:
posted on 2010-02-08 22:49
deercoder 阅读(862)
评论(0) 编辑 收藏 引用