热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

c语言多线程编程windows下,【个人总结系列48】windows及linux环境下的c语言多线程编程总结.docx...

PAGENUMPAGESwindows下的C语言多线程总结在VS2010中,代码不需要特殊配置环境(不需要加入Lib等),直接编写代码,运

PAGE / NUMPAGES

windows下的C语言多线程总结

在VS2010中,代码不需要特殊配置环境(不需要加入Lib等),直接编写代码,运行即可。但是要添加头文件#include ,如果用到了Sleep(1000)函数,要添加头文件#include 。编写代码时用_beginthread()函数即可,这个函数主要有2个重载

_beginthread()函数的2个重载

uintptr_t _beginthread(

void( *start_address )( void * ),

unsigned stack_size,

void *arglist

);

uintptr_t _beginthreadex(

void *security,

unsigned stack_size,

unsigned ( *start_address )( void * ),

void *arglist,

unsigned initflag,

unsigned *thrdaddr

);

参数的意义如下:

unsigned long _beginthreadex( void *security, unsigned?stack_size, unsigned ( __stdcall *start_address?)( void * ), void *arglist, unsigned?initflag, unsigned *thrdaddr?);文档来自于网络搜索

//第1个参数:安全属性,NULL为默认安全属性?//第2个参数:指定线程堆栈的大小。如果为0,则线程堆栈大小和创建它的线程的相同。一般用0?//第3个参数:指定线程函数的地址,也就是线程调用执行的函数地址(用函数名称即可,函数名称就表示地址)?//第4个参数:传递给线程的参数的指针,可以通过传入对象的指针,在线程函数中再转化为对应类的指针?//第5个参数:线程初始状态,0:立即运行;CREATE_SUSPEND:suspended(悬挂)?//第6个参数:用于记录线程ID的地址文档来自于网络搜索

以_beginthread(fun,0,arg)为例进行讲解_beginthread()函数的用法

常用的3个参数的函数讲解。

fun为一个回调函数的名称,即一个自定义的函数,启动的线程即执行这个函数体的内容,这个函数体执行完毕,则线程调用完毕。fun (void* args)的参数必须是这样的,args为传入的参数,如果args是一个具体的参数,则将void*类型转成具体的类型使用。那fun (void* args)中的参数args是怎么传到fun()中的呢?因为_beginthread()函数调用时只传了一个函数名fun作为参数,无法得知将什么作为fun()的参数args传递给fun。这个就是靠_beginthread()函数中的arg参数啦,所以fun()的函数名和参数是分开传递的。文档来自于网络搜索

arg即fun()函数的参数,如果需要传递给fun()函数不止一个参数,则必须转成一个参数,比如将若干参数整合成一个结构体。在fun()函数要用时,直接将fun函数中的void* arg转成具体的类型,再用。如果fun函数不需要为其传递参数,则_beginthread(fun,0,NULL)文档来自于网络搜索

多线程的同步问题

线程的同步和互斥的关系:同步是指【散步在不同进程之间的若干程序片断】不能同时运行,而必须按照一定的次序运行。互斥是指一个线程的片段运行完毕之后另一个线程的片段才能运行。互斥是同步的一种特殊形式。文档来自于网络搜索

使用CRITICAL_SECTION实现:

CRITICAL_SECTION critical;//代码临界区声明(一般作为全局变量使用)

在开启多线程之前,用InitializeCriticalSection(&critical)初始化。然后开启多个线程。文档来自于网络搜索

_beginthread(consumer,0,&buffer); //开线程

_beginthread(producer,0,&buffer); //开线程

在consumer()和producer()函数的编写过程中,用EnterCriticalSection(&critical)和LeaveCriticalSection(&critical)函数将临界代码锁在两个调用语句之间。这2个函数不是锁存临界资源,而是锁存临界代码,而且只锁存相同critical之间的代码,被同一个critical锁存的所有代码段同一时间只能有一个代码段运行。文档来自于网络搜



推荐阅读
  • 本文介绍了使用PHP实现断点续传乱序合并文件的方法和源码。由于网络原因,文件需要分割成多个部分发送,因此无法按顺序接收。文章中提供了merge2.php的源码,通过使用shuffle函数打乱文件读取顺序,实现了乱序合并文件的功能。同时,还介绍了filesize、glob、unlink、fopen等相关函数的使用。阅读本文可以了解如何使用PHP实现断点续传乱序合并文件的具体步骤。 ... [详细]
  • 全面介绍Windows内存管理机制及C++内存分配实例(四):内存映射文件
    本文旨在全面介绍Windows内存管理机制及C++内存分配实例中的内存映射文件。通过对内存映射文件的使用场合和与虚拟内存的区别进行解析,帮助读者更好地理解操作系统的内存管理机制。同时,本文还提供了相关章节的链接,方便读者深入学习Windows内存管理及C++内存分配实例的其他内容。 ... [详细]
  • 本文介绍了在Python3中如何使用选择文件对话框的格式打开和保存图片的方法。通过使用tkinter库中的filedialog模块的asksaveasfilename和askopenfilename函数,可以方便地选择要打开或保存的图片文件,并进行相关操作。具体的代码示例和操作步骤也被提供。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • 本文探讨了C语言中指针的应用与价值,指针在C语言中具有灵活性和可变性,通过指针可以操作系统内存和控制外部I/O端口。文章介绍了指针变量和指针的指向变量的含义和用法,以及判断变量数据类型和指向变量或成员变量的类型的方法。还讨论了指针访问数组元素和下标法数组元素的等价关系,以及指针作为函数参数可以改变主调函数变量的值的特点。此外,文章还提到了指针在动态存储分配、链表创建和相关操作中的应用,以及类成员指针与外部变量的区分方法。通过本文的阐述,读者可以更好地理解和应用C语言中的指针。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • 预备知识可参考我整理的博客Windows编程之线程:https:www.cnblogs.comZhuSenlinp16662075.htmlWindows编程之线程同步:https ... [详细]
  • 这篇文章主要介绍了Python拼接字符串的七种方式,包括使用%、format()、join()、f-string等方法。每种方法都有其特点和限制,通过本文的介绍可以帮助读者更好地理解和运用字符串拼接的技巧。 ... [详细]
  • Android工程师面试准备及设计模式使用场景
    本文介绍了Android工程师面试准备的经验,包括面试流程和重点准备内容。同时,还介绍了建造者模式的使用场景,以及在Android开发中的具体应用。 ... [详细]
  • 基于Socket的多个客户端之间的聊天功能实现方法
    本文介绍了基于Socket的多个客户端之间实现聊天功能的方法,包括服务器端的实现和客户端的实现。服务器端通过每个用户的输出流向特定用户发送消息,而客户端通过输入流接收消息。同时,还介绍了相关的实体类和Socket的基本概念。 ... [详细]
  • Java和JavaScript是什么关系?java跟javaScript都是编程语言,只是java跟javaScript没有什么太大关系,一个是脚本语言(前端语言),一个是面向对象 ... [详细]
  • 深入解析Linux下的I/O多路转接epoll技术
    本文深入解析了Linux下的I/O多路转接epoll技术,介绍了select和poll函数的问题,以及epoll函数的设计和优点。同时讲解了epoll函数的使用方法,包括epoll_create和epoll_ctl两个系统调用。 ... [详细]
author-avatar
opheliamaizi
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有