随笔-145  评论-173  文章-70  trackbacks-0
首先看看下面的代码:
#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 阅读(835) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理