Windows下C语言多线程函数_beginthread简单入门应用例子

Windows下C语言多线程函数_beginthread简单入门应用例子有时候我们在 Windows 下使用 C 语言进行一些小工程编写的时候 需要用到并行程序设计的知识 但是一般情况下 我们学习 C 语言都很少接触并行程序的设计 对我而言 更加习惯使用 Java 的并行程序设计 最近学习需要 接触了 C 语言的多线程 网上搜索到的例子都不太容易理解 很多还是使用 C 知识的 特别对于小白来说学习起来更加困难 因此在这里分享一下自己的学习心得 本文只涉及基本的 C 语言

有时候我们在Windows下使用C语言进行一些小工程编写的时候,需要用到并行程序设计的知识。但是一般情况下,我们学习C语言都很少接触并行程序的设计,对我而言,更加习惯使用Java的并行程序设计。最近学习需要,接触了C语言的多线程,网上搜索到的例子都不太容易理解,很多还是使用C++知识的,特别对于小白来说学习起来更加困难。因此在这里分享一下自己的学习心得,本文只涉及基本的C语言。


Windows下的C语言多线程函数跟Linux的是不同的,但是网上找的很多例子都没有注明是哪个系统版本下的函数,让初学者模仿学习的时候频频犯错。因此,我首先注明我的系统环境:

Windows 10 64位系统,编程软件为:Dev-C++ 5.11版本

_ beginthread、_beginthreadex 两个函数是Windows下C语言推荐使用的创建多线程的函数,简单的说,_beginthread函数很简单,就是创建一个后台线程并即刻执行,直到运行结束或者调用_endthread函数终止线程。缺点就是你没法很好的控制由_beginthread函数创建的线程,因为它没有任何返回值给你用来后续的控制,它创建完成后立马就执行了,由不得你控制。

_beginthreadex则是_beginthread的升级版,形参更多,可控性更好,可以实现线程的同步,适用范围更加广。因此也更加复杂。本文则主要讲解_beginthread的使用方法。

_beginthread函数有三个形参,函数原型如下:

uintptr_t _beginthread( void( __cdecl *start_address )( void * ), unsigned stack_size, void *arglist );
  • 第一个参数:

    start_address为启动开始执行新线程的例程的地址,一般我们执行一个函数,这个参数就是你定义的函数名。

  • 第二个参数:

    stack_size,新线程的堆栈大小或 0。一般我们使用0,代表跟主线程使用一样的堆栈。

  • 第三个参数:

    arglist,要传递到新线程的参数列表或 NULL。如果你要传递参数给新的线程,可以在这里写上参数的地址指针,如果不需要传递数据,就使用NULL。


好,下面是实际例子:

注意:需要包含头文件process.h,否则编译出错。使用Sleep函数延时的还需加入windows.h头文件

例子一:不需要传递参数的情形

#include 
      #include 
      #include 
      int a = 0; //全局变量 //自定义的函数,在新的线程中执行 void fun1(void *){ 
    //形参void * 不可省略,否则编译出错 while(1){ a++; if(a>=10) break; Sleep(200); printf("a = %d, 线程运行中...\n", a); } printf("新建的后台线程结束\n\n"); _endthread(); } int main(){ _beginthread(fun1,0,NULL); while(1){ if(a >= 10){ printf("主线程执行完毕\n"); break; } } return 0; }

这里写图片描述

程序讲解:我们实现在main主程序当中创建一个新的线程,然后在新的线程当中计数,计数一次延时200毫秒,如果全局变量a达到10就结束新的线程并输出一句话提醒。在新的线程运行过程中,主线程在创建新的线程之后,就不停地检查全局变量a的值,如果等于10就退出循环,结束主线程。特别提醒的,这里我们可以使用全局变量的方式来进行线程间的通信,非常简单,只需要注意全局变量a定义的位置就好。

例子二:需要在主线程当中传递参数给新线程

#include 
      #include 
      #include 
      int a = 0; //全局变量 void fun2(void *pArg){ printf("主线程传递进来的值是:%d\n\n", *(int *)pArg); a = *(int *)pArg; while(1){ a++; if(a>=10) break; Sleep(200); printf("a = %d, 线程运行中...\n", a); } printf("新建的后台线程结束\n\n"); _endthread(); } int main(){ int b = 5; int* arg = &b; _beginthread(fun2, 0, (void *)arg); while(1){ if(a >= 10){ printf("主线程执行完毕\n"); break; } } return 0; }

这里写图片描述

程序讲解:在这个例子当中,我们在主线程当中传入一个参数给新建的线程,然后在新的线程中将传入的数值赋给全局变量a再进行计数。特别需要注意的是,使用_beginthread创建线程时候,传递的参数必须是void * 型的指针值,实际使用的时候,我们就需要用到强制类型转换了,否则会无法编译通过。传入参数的时候强制转换为void * 型,在新线程中取出来使用的时候就再次强制类型转换,变成原来的函数类型。总之,传入的就是主函数定义的参数的地址指针,使用过程中需要注意转换。


总结:根据上文的示例,我们可以很好地理解_begithread函数在创建新线程的用法,在我们平时的初级开发当中涉及到多线程编程的时候很有帮助,可以短时间内上手并行程序设计,希望对大家有所帮助。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/201312.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月20日 上午9:37
下一篇 2026年3月20日 上午9:37


相关推荐

  • java分页计算_java分页算法「建议收藏」

    java分页计算_java分页算法「建议收藏」关键字:j2ee网页struts分页算法/***分页算法*/packagecn.eshore.user.util;publicclassPageBean{privateintcurrentPage=1;//当前页数publicinttotalPages=0;//总页数privateintpageSize=0;//每页显示数privateintto…

    2022年10月3日
    4
  • 系统数据库的概念结构,逻辑结构,物理结构设计方法_数据库的物理独立性是指

    系统数据库的概念结构,逻辑结构,物理结构设计方法_数据库的物理独立性是指由于自己在写这一部分的报告时,总感觉不能很好地理解概念含义,具体的设计目标也不知道用怎样的形式来表达。在做完相关报告之后,想着把老师指导之后改正的作业展示一下,希望可以给有类似问题的小伙伴一点点帮助。系统的概念数据库设计将需求分析得到的用户需求抽象为信息结构(即概念模型)的过程就是概念结构设计,最后生成的模型是E-R图。注:1、先写局部E-R图,再写整体的E-R图2、若所设计系统的实体、属性与联系很多,绘制出来的总E-R图过于复杂、不清晰,可以将整体的E-R图分解成实体-属性图和实体-联系图。其

    2022年10月11日
    7
  • docker下载安装教程_mac docker 性能

    docker下载安装教程_mac docker 性能前言Docker提供轻量的虚拟化,你能够从Docker获得一个额外抽象层,你能够在单台机器上运行多个Docker微容器,而每个微容器里都有一个微服务或独立应用,例如你可以将Tomcat运行在一个D

    2022年7月28日
    34
  • Linux安装yum过程(超详细!)

    Linux安装yum过程(超详细!)Linux 安装 yum 错误处理方法功能快捷键合理的创建标题 有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中 居左 居右 SmartyPants 创建一个自定义列表如何创建一个注脚注释也是必不可少的 KaTeX 数学公式新的甘特图功能 丰富你的文章 UML 图表 FLowchart 流程图导出与导入导出导入本人小白 刚开始接触 Linux 可是当

    2026年3月20日
    2
  • N8N自动化教程:如何用Reddit API打造AI驱动的内容收集系统

    N8N自动化教程:如何用Reddit API打造AI驱动的内容收集系统

    2026年3月15日
    2
  • 笔记本计算机的连接无线网络连接,笔记本电脑连接wifi的方法步骤

    笔记本计算机的连接无线网络连接,笔记本电脑连接wifi的方法步骤笔记本电脑怎么连接 wifi Wi Fi 是一种可以将个人电脑 手持设备 如 pad 手机 等终端以无线方式互相连接的技术 事实上它是一个高频无线电信号 下面就由学习啦小编来给大家说说笔记本电脑怎么连接 wifi 的吧 欢迎大家前来阅读 笔记本电脑怎么连接 wifi 首先需要创建无线网络链接 进入桌面左下角处的 Win7 开始菜单 点击 控制面板 笔记本电脑连接 wifi 的步骤图 1 然后点击 网络和 Internet

    2026年3月17日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号