线程间通信的几种方法_c语言线程函数

线程间通信的几种方法_c语言线程函数线程间如何通信/同步?此前小编给大家介绍了进程间通信的方法,于是一些伙伴又好奇线程间的通信及同步方法,没关系,下面小编就继续给大家科普下线程间通信及同步的方法。线程间通信及同步方法介绍:一、线程间的通信方式1、使用全局变量主要由于多个线程可能更改全局变量,因此全局变量最好声明为volatile。2、使用消息实现通信在Windows程序设计中,每一个线程都可以拥有自己的消息队列(UI线程默认自带消息…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

线程间如何通信/同步?此前小编给大家介绍了进程间通信的方法,于是一些伙伴又好奇线程间的通信及同步方法,没关系,下面小编就继续给大家科普下线程间通信及同步的方法。

174a3dc2b1617613f6275146a1660f5d.png

线程间通信及同步方法介绍:

一、线程间的通信方式

1、使用全局变量

主要由于多个线程可能更改全局变量,因此全局变量最好声明为volatile。

2、使用消息实现通信

在Windows程序设计中,每一个线程都可以拥有自己的消息队列(UI线程默认自带消息队列和消息循环,工作线程需要手动实现消息循环),因此可以采用消息进行线程间通信sendMessage,postMessage。

1)定义消息#define WM_THREAD_SENDMSG=WM_USER+20;

2)添加消息函数声明afx_msg int OnTSendmsg();

3)添加消息映射ON_MESSAGE(WM_THREAD_SENDMSG,OnTSM);

4)添加OnTSM()的实现函数;

5)在线程函数中添加PostMessage消息Post函数。

3、使用事件CEvent类实现线程间通信

Event对象有两种状态:有信号和无信号,线程可以监视处于有信号状态的事件,以便在适当的时候执行对事件的操作。

1)创建一个CEvent类的对象:CEvent threadStart;它默认处在未通信状态;

2)threadStart.SetEvent();使其处于通信状态;

3)调用WaitForSingleObject()来监视CEvent对象。

二、线程间的同步方式

各个线程可以访问进程中的公共变量,资源,所以使用多线程的过程中需要注意的问题是如何防止两个或两个以上的线程同时访问同一个数据,以免破坏数据的完整性。

数据之间的相互制约包括:

1、直接制约关系,即一个线程的处理结果,为另一个线程的输入,因此线程之间直接制约着,这种关系可以称之为同步关系。

2、间接制约关系,即两个线程需要访问同一资源,该资源在同一时刻只能被一个线程访问,这种关系称之为线程间对资源的互斥访问,某种意义上说互斥是一种制约关系更小的同步。

线程间的同步方式有四种:

1、临界区

临界区对应着一个CcriticalSection对象,当线程需要访问保护数据时,调用EnterCriticalSection函数;当对保护数据的操作完成之后,调用LeaveCriticalSection函数释放对临界区对象的拥有权,以使另一个线程可以夺取临界区对象并访问受保护的数据。

PS:关键段对象会记录拥有该对象的线程句柄即其具有“线程所有权”概念,即进入代码段的线程在leave之前,可以重复进入关键代码区域。所以关键段可以用于线程间的互斥,但不可以用于同步(同步需要在一个线程进入,在另一个线程leave)。

2、互斥量

互斥与临界区很相似,但是使用时相对复杂一些(互斥量为内核对象),不仅可以在同一应用程序的线程间实现同步,还可以在不同的进程间实现同步,从而实现资源的安全共享。

PS:

1)互斥量由于也有线程所有权的概念,故也只能进行线程间的资源互斥访问,不能由于线程同步;

2)由于互斥量是内核对象,因此其可以进行进程间通信,同时还具有一个很好的特性,就是在进程间通信时完美的解决了“遗弃”问题。

3、信号量

信号量的用法和互斥的用法很相似,不同的是它可以同一时刻允许多个线程访问同一个资源,PV操作。

PS:事件可以完美解决线程间的同步问题,同时信号量也属于内核对象,可用于进程间的通信。

4、事件

事件分为手动置位事件和自动置位事件。事件Event内部它包含一个使用计数(所有内核对象都有),一个布尔值表示是手动置位事件还是自动置位事件,另一个布尔值用来表示事件有无触发。由SetEvent()来触发,由ResetEvent()来设成未触发。

PS:事件是内核对象,可以解决线程间同步问题,因此也能解决互斥问题。

关于线程间的通信及同步方法就给大家讲解到这里了,更多关于线程同步的文章,大家可以参考:《线程同步的方法有哪些?Linux下实现线程同步的三种方法》

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • malloc函数的用法(超级白话版)[通俗易懂]

    malloc函数的用法(超级白话版)[通俗易懂]malloc函数的用法在这里,我不讲什么原理性的东西,我就单纯讲讲怎么用。首先malloc()函数返回的是void*类型,所以用的时候要进行强制类型转换malloc函数用完后,记得使用free()函数来释放空间,不然只分配不释放会出问题例L=(int*)malloc(sizeof(int));我们看到了先用int*进行了强制类型转换,说明L的类型为int*,⚠️如果你不进行强制类型转换,分配空间会报错sizeof(int)的意思是分配的字节数,分配和int类型一样的字节数,当然,

    2022年4月29日
    59
  • 玩转pycharm_pycharm首次使用教程

    玩转pycharm_pycharm首次使用教程点击“简说Python”,选择“星标公众号”福利干货,第一时间送达!本文授权转载自Python编程时光,禁二次转载作者:Python编程时光阅读文本大概需要6分钟。大…

    2022年8月26日
    4
  • 下列变量名不符合python命名规范的是_以下选项中,不符合 Python 语言变量命名规则的有( )…「建议收藏」

    下列变量名不符合python命名规范的是_以下选项中,不符合 Python 语言变量命名规则的有( )…「建议收藏」【单选题】Python关系运算符中表示“不等于”的是哪个?________【单选题】下面________不是Python合法的标识符【其它】自选某一主题查阅文献(必须有英文文献),撰写关于特殊儿童动作发展或康复训练相关的文献综述。主题围绕关键词:特殊儿童(SpecialChildren)、自闭症(Autism、autisticdisorder、ASD)、多动症(att…

    2022年6月7日
    82
  • Freemarker判断对象是否为空的用法

    Freemarker判断对象是否为空的用法注:https://blog.csdn.net/elladu/article/details/80393814freemark判断对象的属性<#if(${blog.belongid==1})>red</#if>以上不对,应该是<#if(blog.belongid==1)>red</#if>参考…

    2022年5月24日
    59
  • Python 逐行读取txt 文件并生成列表

    前言开始1.载入文件2.读取数据流3.数据处理4.关闭文件前言我们在编写一些自动化脚本的时候,为了方便,经常需要以txt文件作为数据输入,今天就跟大家讨论一下如何对txt文件进行读取并生成对应的列表等程序可操作的数据载体。开始1.载入文件这步就大家比较熟悉,文件操作中最基本的了。因为我们只需要读取文件,并不需要写入文件,所以在这里指定mode=”r”为只读模式(默认)。f=open(“C:/foo.txt”,”r”,encoding=’utf-8′)此时就有了这.

    2022年4月8日
    1.5K
  • 把html转成xpath可以解析的对象「建议收藏」

    把html转成xpath可以解析的对象「建议收藏」fromlxmlimportetreeresponse_detail=requests.get(src__url,headers=getHeaderObject()).content#使用xpathpage_source=etree.HTML(response_detail.decode(‘utf-8’))

    2025年10月8日
    1

发表回复

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

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