线程的原理

创建线程

特别注意:如果在代码中有使用标准C运行库中的函数时,尽量使用_beginthreadex()来代替CreateThread()

因为_beginthreadex在内部调用了CreateThread,在调用之前_beginthreadex做了很多的工作,从而使得它比CreateThread更安全。

例子一

#include <windows.h>
#include <stdio.h>
#include <process.h>unsigned Counter;
unsigned __stdcall SecondThreadFunc(void* pArguments)
{printf("In second thread...\n");while (Counter < 1000000)Counter++;_endthreadex(0);return 0;
}//创建单个线程实例,并等待该线程执行完成
int main()
{HANDLE hThread;unsigned threadID;printf("Creating second thread...\n");// Create the second thread.hThread = (HANDLE)_beginthreadex(NULL, 0, &SecondThreadFunc, NULL, 0, &threadID);// Wait until second thread terminates.WaitForSingleObject(hThread, INFINITE);printf("Counter should be 1000000; it is-> %d\n", Counter);// Destroy the thread object.CloseHandle(hThread);
}

例子二

}//创建多子个线程实例
#include <stdio.h>
#include <process.h>
#include <windows.h>
//子线程函数
unsigned int __stdcall ThreadFun(PVOID pM)
{printf("线程ID号为%4d的子线程说:Hello World\n", GetCurrentThreadId());return 0;
}
//主函数,所谓主函数其实就是主线程执行的函数。
int main()
{printf("     创建多个子线程实例 \n");printf(" -- by MoreWindows( http://blog.csdn.net/MoreWindows ) --\n\n");const int THREAD_NUM = 5;HANDLE handle[THREAD_NUM];for (int i = 0; i < THREAD_NUM; i++)handle[i] = (HANDLE)_beginthreadex(NULL, 0, ThreadFun, NULL, 0, NULL);WaitForMultipleObjects(THREAD_NUM, handle, TRUE, INFINITE);return 0;
}

WaitForSingleObject()

DWORD WaitForSingleObject( HANDLE hHandle, DWORDdwMilliseconds);

有两个参数,分别是THandle和Timeout(毫秒单位)。如果想要等待一条线程,那么你需要指定线程的Handle,以及相应的Timeout时间。当然,如果你想无限等待下去,Timeout参数可以指定系统常量INFINITE。

如果第二个参数为0,那么函数就测试同步对象的状态并立即返回。如果等待超时,该函数返回WAIT_TIMEOUT。如果该函数失败,返回WAIT_FAILED。可以通过下面的代码来判断:

DWORD dw = WaitForSingleObject(hProcess, 5000); //等待一个进程结束,时间为5000ms
switch (dw)
{
case WAIT_OBJECT_0:
// hProcess所代表的进程在5秒内结束
break;

case WAIT_TIMEOUT:
// 等待时间超过5秒
break;

case WAIT_FAILED:
// 函数调用失败,比如传递了一个无效的句柄
break;
}

参考:

https://blog.csdn.net/morewindows/article/details/7421759

c++多线程之_beginthreadex相关推荐

  1. C++多线程实例(_beginThreadex创建多线程)

    C++多线程(二)(_beginThreadex创建多线程) C/C++ Runtime 多线程函数 一 简单实例(来自codeprojct:http://www.codeproject.com/us ...

  2. c++类成员函数中调用多线程函数_beginthreadex()

    #include "stdafx.h" #include #include #include using namespace std; class A {public:int n; ...

  3. 多线程之 CreateThread与_beginthreadex本质区别

    本文将带领你与多线程作第一次亲密接触,并深入分析CreateThread与_beginthreadex的本质区别,相信阅读本文后你能轻松的使用多线程并能流畅准确的回答CreateThread与_beg ...

  4. 【转】windows多线程CreateThread与_beginthreadex本质区别

    本文将带领你与多线程作第一次亲密接触,并深入分析CreateThread与_beginthreadex的本质区别,相信阅读本文后你能轻松的使用多线程并能流畅准确的回答CreateThread与_beg ...

  5. 多线程 CreateThread与_beginthreadex本质区别

    本文参考了 http://blog.csdn.net/morewindows/article/details/7421759 主函数创建一个线程,并且等待它执行完毕 #include <iost ...

  6. _beginThreadex创建多线程解读

    _beginThreadex创建多线程解读 一.须要的头文件支持 #include <process.h>         // for _beginthread() 须要的设置:Proj ...

  7. _beginthreadex 创建多线程解读

    一.解释 (1)如果你正在编写C/C++代码,决不应该调用CreateThread.相反,应该使用VisualC++运行期库函数_beginthreadex,退出也应该使用_endthreadex.如 ...

  8. C/C++ _beginthreadex 多线程操作

    最近主管没有分配任务,于是将C/C++的线程学习一下. 经过了解才知道,C++03之前,用的创建线程都是CreateThread 与 _beginthreadex.使用这个两个函数进行创建线程. 然后 ...

  9. 秒杀多线程第二篇 多线程第一次亲密接触 CreateThread与_beginthreadex本质区别

    本文将带领你与多线程作第一次亲密接触,并深入分析CreateThread与_beginthreadex的本质区别,相信阅读本文后你能轻松的使用多线程并能流畅准确的回答CreateThread与_beg ...

最新文章

  1. 笔试题——max pooling滑动窗口实现(python 代码)
  2. libevent mysql_在 libevent 中使用 MariaDB(MySQL)
  3. Linux多线程实践(一)线程基本概念和理论
  4. Java项目如何改成maven_普通java项目改进为maven:ecplise
  5. 大数据可视化html模板开源_让数据栩栩如生,蚂蚁金服新一代开源数据可视化解决方案——AntV...
  6. 【大话数据结构算法】冒泡排序
  7. 不安装oracle客户端如何用plsql连接oracle
  8. Mr.J--JS学习(事件处理函数包装)
  9. Atom飞行手册翻译: 4.3 作用域设置、作用域和作用域描述符
  10. 【clickhouse】ClickHouse官方中文文档 阅读笔记
  11. 拆除指令怎么设置_张店区设置不合理隔离桩 将陆续拆除
  12. OpenDDS的学习和使用
  13. 仿链家地图找房_iOS地图找房、周边(仿链家、安居客等地图找房)-高德地图-OC...
  14. H264/AVC协议基本概况
  15. xshell修改linux编码,xshell更改字符编码,xshell系统设置中文乱码怎么解决
  16. 《数字电路与逻辑设计》笔记及经典问答题
  17. Windows_Server_2016 远程桌面120天授权过期
  18. Ran 0 tests in 0.000s
  19. java 中rest,Java中的REST调用
  20. iOS解决键盘收起时页面上移的问题

热门文章

  1. Oracle数据库手工扩大表空间三步走
  2. 一场特殊的高峰对谈圆桌,中西方大拿华山论剑
  3. 彩电行业步入3.0时代,创维领跑OLED普及新赛道
  4. 出奇制胜:绕过Cloudflare验证的神秘方法
  5. java发送邮件带多个附件_Java发送邮件(支持多个附件)
  6. linux中用命令创建物理卷,11.17 pvcreate指令:创建物理卷
  7. PHP 字符串中出现乱码解决方法
  8. [转]关于session的详细解释
  9. 2019年独角兽企业榜单,中美依然霸榜
  10. HAWQ从0.5开始安装说明.包含hadoop和hawq