有时候我们在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 <stdio.h>
#include <windows.h>
#include <process.h>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 <stdio.h>
#include <windows.h>
#include <process.h>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函数在创建新线程的用法,在我们平时的初级开发当中涉及到多线程编程的时候很有帮助,可以短时间内上手并行程序设计,希望对大家有所帮助。

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

  1. windows下C语言多线程编程

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

  2. Windows下C语言实现HTTP客户端

    Windows下C语言实现HTTP客户端 1 #include "stdafx.h" //控制台应用自带头文件,能够加快编译的速度 2 #include<winsock2.h ...

  3. linux 创建线程函数吗,[笔记]linux下和windows下的 创建线程函数

    linux下和windows下的 创建线程函数 #ifdef __GNUC__ //Linux #include #define CreateThreadEx(tid,threadFun,args) ...

  4. Windows下R语言环境安装

    Windows下R语言环境安装 R官网: https://www.r-project.org/ 按照如下步骤下载windows中的安装文件R-4.1.0-win.exe 文件已经下载完成:R-4.1. ...

  5. Windows下Go语言的安装和运行

    参考:https://blog.csdn.net/SquirrelYuyu/article/details/82776029 Windows下Go语言的安装和运行 文章目录 Go语言的安装与配置 Go ...

  6. Windows下nginx的安装及使用方法入门

    Windows下Nginx的安装及使用方法入门 nginx功能之一可以启动一个本地服务器,通过配置server_name和root目录等来访问目标文件 一. 下载 官网地址:http://nginx. ...

  7. 基于vue-cli、elementUI的Vue超简单入门小例子

    基于vue-cli.elementUI的Vue超简单入门小例子 这个例子还是比较简单的,独立完成后,能大概知道vue是干嘛的,可以写个todoList的小例子. 开始写例子之前,先对环境的部署做点简单 ...

  8. Windows下C语言网络编程快速入门

    C语言的学习,一般的方式是,先学C,然后是C++,最好还要有汇编语言和微机原理基础,然后才是Visual C++.这样的方式,对学习者来说,要花费很多时间和耐力.而在学校教学中,也没有时间深入学习Wi ...

  9. c语言fputc 函数头,简单对比C语言中的fputs()函数和fputc()函数

    简单对比C语言中的fputs()函数和fputc()函数 C语言fputc()函数:写文件函数(将一指定字符写入文件流中) 头文件: #include 定义函数: int fputc(int c, F ...

  10. Windows下C语言实现HTTP client暨初次使用VS2017 win32 编程

    https://blog.csdn.net/xiaoge2030/article/details/77604645 创建空项目 https://blog.csdn.net/hzrandd/articl ...

最新文章

  1. Android maps应用
  2. 学会阅读Java字节码
  3. python教程:循环(while和for)
  4. Redisson 管道批量发送命令流程分析
  5. C语言实现段树segment tree(附完整源码)
  6. java复制单个文件
  7. aws spark_使用Spark构建AWS数据湖时的一些问题以及如何处理这些问题
  8. 监控linux时间不对,shell 计算故障时间 配合web监控
  9. HTML+CSS+JS实现 ❤️slicebox酷炫3d图片轮播切换❤️
  10. 【bzoj4518】[Sdoi2016]征途 斜率优化dp
  11. Atiitt 项目 产品 实现的目标
  12. C语言实现SM4加解密
  13. 射频回波损耗、反射系数、电压驻波比、S参数的含义与关系
  14. 解析几何 直线与平面 直线与平面(1.2)
  15. 荆棘遍地,鲜花满开(随笔二)
  16. webservice wsdl 转java对象
  17. WebBrowser打开Word文档的一些注意事项
  18. 虚拟机关机/重启后都要重装虚拟机的操作系统
  19. 通过Vim执行Python3脚本遇到的坑
  20. C++中使用placement new

热门文章

  1. java wifi开发教程_WiFi技术
  2. win10 android4.4 驱动,ST-LINK/V2驱动win10版
  3. 电脑关机后键盘灯和风扇还在转的解决方案
  4. java 开源的框架_现有Java开源BI前端框架
  5. 贾俊平统计学第七版课后习题答案
  6. Unity3D 世界坐标转屏幕坐标的坑
  7. STM32F407概述
  8. python 爬取 全网代理 IP 网站 + 破解端口加密混淆
  9. [Ubuntu 18.04][CPU]MindSpore V1.0源码安装初体验(直播结束)
  10. 时钟软件哪个好?9款苹果电脑时钟提醒软件推荐