CreateThread简单那多线程编程
来源:互联网 发布:mac浆果色口红 编辑:程序博客网 时间:2024/05/16 12:33
CreateThread简单那多线程编程
作者:vpoet
mail:18200268879@163.com
在进行多任务处理的时候我们往往会用到多线程技术,多线程理论上是多个线程同事处理不同的工作,但是这只针对多核的CPU而言
但是对于单核CPU多线程往往实现的方式是:CPU为各个线程分配时间片,让各个线程循环的执行,但是这个时间片又很短,所以给我
们只管的映像就好像是多个线程在同时工作。
本文主要使用windows API CreateThread函数进行多线程演示。
首先看看MSDN上关于CreateThread函数的说明:
参数说明:
该参数决定子线程是否继承父进程的安全属性,如果为NULL,表示不继承。关于SECURITY_ATTRIBUTES结构体请查询MSDN
该参数则指定线程函数地址,说白了就是线程函数名
该参数为传递给线程函数的参数
#include <windows.h>#include "stdio.h"DWORD WINAPI ThreadOne(LPVOID lpParameter){printf("ThreadOne is Runing\n");Sleep(100);return 0;}int main(){HANDLE HOne;printf("***********************vpoet******************\n");HOne=CreateThread(NULL,0,ThreadOne,NULL,0,NULL);printf("ThreadOne Begin!\n");CloseHandle(HOne);printf("MainThread Over!\n");return 0;}
咦!是不是看出来什么问题了,子线程貌似没有运行主线程就退出了,这是怎么回事呢,
那么我们在
printf("MainThread Over!\n");
之前再加入一句代码
Sleep(1000)
让主线程延时1s等待子线程的执行。因为1s足够让子线程执行完毕了所以这次程序就会在子线程运行结束后正常退出了。
当然还有其他方法来等待子线程正常执行并返回,对了还有个HOne这玩意儿还没有介绍,
Handle其实就是一个句柄对象,就像是一个结构体或者类一样,只不过它是内核对象,由内核
自己维护。为啥需要CloseHand()呢 百度百科是这样说的:
关闭一个内核对象。其中包括文件、文件映射、进程、线程、安全和同步对象等。在CreateThread成功之后会返回一个hThread的handle,且内核对象的计数加1,CloseHandle之后,引用计数减1,当变为0时,系统删除内核对象。
若在线程执行完之后,没有调用CloseHandle,在进程执行期间,将会造成内核对象的泄露,相当于句柄泄露,但不同于内存泄露,这势必会对系统的效率带来一定程度上的负面影响。但当进程结束退出后,系统会自动清理这些资源。
这里要介绍一个API叫WaitForSingleObject;
我们MSDN一下:
MSDN这样说该函数只有在以下两种情况下才返回:
1.指定的对象有信号状态时
2.等待超时
那到底是什么意思呢,别着急,我们再看看参数:
If this handle is closed while the wait is still pending, the function's behavior is undefined.
该参数是一个句柄对象,如果句柄已经Close掉后还在WaitForSingleObject那么这种情况是未定义的,未定义是啥意思了就是会有意想不到的效果,
说白了就是重大的隐藏的BUG
该参数是指定超时间隔,如果参数为零则函数马上返回,如果参数为INFINITE,函数会一直等待。
另外该函数的返回值有主要有两种状态:
WAIT_OBJECT_0 The state of the specified object is signaled. 表示句柄为有信号状态时候返回
WAIT_TIMEOUT The time-out interval elapsed, and the object's state is nonsignaled. 表示等待超时返回
现在我们去掉主函数的Sleep延时1s的代码,在CreateThread()后面加上一句:
WaitForSingleObject(HOne,INFINITE);
现在我们再看看运行结果:
果然正确,现在明白WaitForSingleObject(HOne,INFINITE);的意思了吧
1 0
- CreateThread简单那多线程编程
- CreateThread简单那多线程编程
- CreateThread多线程编程测试
- 多线程编程 CreateThread
- 【多线程简单实例】CreateThread实现
- 多线程编程一---CreateThread透析
- 多线程编程 - 从 CreateThread 说起
- CreateThread创建一个简单的多线程
- 多线程编程(一)——CreateThread
- 多线程编程(2) - 从 CreateThread 说起
- 多线程编程(3) - 从 CreateThread 说起[续]
- c++中的多线程编程技术Createthread()
- 多线程编程(1)- 从 CreateThread 说起
- 多线程编程(2) - 从 CreateThread 说起[续]
- 一步一步学习多线程编程之CreateThread
- WIN32多线程编程( CreateThread 版本)
- 多线程编程(2) - 从 CreateThread 说起
- 多线程编程(3) - 从 CreateThread 说起[续]
- pthread win32 VS2010多线程编程
- leetcode由易入难——【1】Add Binary
- 如何获取自己的SSL证书
- CPassword弱密码生成器1.0
- jquery获取浏览器类型和版本号
- CreateThread简单那多线程编程
- SpringMVC下载文件(不是Spring下载文件)
- 网络基本概念之TCP, UDP, 单播(Unicast), 组播(Multicast)
- Ember.js实战
- Django+MySQL安装配置详解(Linux)[更新为1.8.2版]
- 美国市场上15门最赚钱的编程语言
- @Transactional注解工作原理
- 面试题总结3
- Linux中的特殊权限