- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第三讲:线程通信解析
第三讲:线程通信
很多的时候一件事情需要很多人完成,那么此时这些人就避免不了需要相互进行交流,在程序中利用多线程进行工作的时候同样也是这个道理,为了能够使得线程之间能够更好的协调的完成任务,这些线程也需要进行交流。称之为线程通信。
【线程通信的方法】
线程通信有很多的方法,在MFC平台中普遍采用的方法是使用全局变量和使用自定义消息两种方案。
使用全局变量:
使用全局变量实现线程间通信是最简单的线程间的通信方式。核心做法是在程序中定义全局变量,各个线程都可以直接访问此全局变量的值,从而达到线程间通信的目的。在实际的编程中,通常用在下面的两种情况:
使用全局变量控制线程的工作状态
通过全局变量实现多个线程操作一个对象
使用自定义消息:
除了使用全局变量进行通信外还可以通过使用自定义消息的方式完成线程间的通信。通常情况下,此种方式用在线程将数据传递给进程的情况。
【使用全局变量】
使用全局变量通信即使得多个线程访问同一个全局变量以完成线程间的数据交换。在《操作系统》学科中通常将这种方法称之为“共享内存”方法,即多个线程共享一个内存空间,通过访问同一个内存空间完成线程通信。如下图:
上图中线程A将需要发给线程B的消息放在全局变量所占用的内存区域中,线程B通过访问内存块获取线程A发送的消息。
【最简单的消息】
最简单的消息通信莫过于上述所描述的单方向的通信了,假设现在有线程1和线程2,线程1通过全局变量message将要发送的消息传递给线程2。程序如下:
#include iostream
#include string
#include Windows.h
#include conio.h
using namespace std;
string message;//定义存放消息的全局变量
DWORD WINAPI Thread1(LPVOID p)//线程1
{
message = 这是消息;//存放发送给线程2的消息
return 0;
}
DWORD WINAPI Thread2(LPVOID p)
{
coutmessageendl;//输出全局变量中的消息
return 0;
}
void main()
{
DWORD ThreadID1,ThreadID2;//线程ID
HANDLE ThreadHandle1,ThreadHandle2;//线程句柄
ThreadHandle1 = ::CreateThread(0,0,Thread1,0,0,ThreadID1);//创建线程1
ThreadHandle2 = ::CreateThread(0,0,Thread2,0,0,ThreadID2);//创建线程2
getch();
CloseHandle(ThreadHandle1);//关闭线程1
CloseHandle(ThreadHandle2);//关闭线程2
}
运行效果如下:
【多次通信的情况】
上述的情况是最简单的通信,不仅仅是单方向的,而且只是发送了一次消息,对于开发的项目来说,可行性并不大,因此接下来我们需要讨论一种复杂的情况,当然在讨论之间考虑大家的接受度我们先从复杂的情况的最简单情况开始。同样是线程1和线程2进行通信。此时线程1有发送消息的自主权,它可以决定自己何时发送消息以及发送消息的内容,而线程2同样还是被动的接受线程1发送的消息,并且打印出来。如下图所示:
在这种情况下由于线程2并不知道线程1何时会将消息发送到内存块儿中,因此就需要不断的对该内存块儿进行查询,如果此时内存块儿为空(没有消息)或者内存块儿中的内容还是上一次接收到的内容,则继续查询。该方法称之为程序查询法,也叫“轮询”。代码如下:
#include iostream
#include string
#include Windows.h
#include conio.h
using namespace std;
char message;//定义存放消息的全局变量
DWORD WINAPI Thread1(LPVOID p)//线程1
{
for(int i=0;i10;i++)
message = A+i;//存放发送给线程2的消息
return 0;
}
DWORD WINAPI Thread2(LPVOID p)
{
char old = NULL;//线程2上一次输出的消息
do
{
coutmessage\t;
old = message;
if(old == message || message == NULL)
continue;
}whil
您可能关注的文档
最近下载
- 医药代表拜访技巧大揭秘:如何与医生进行有意义的对话.pptx VIP
- 2026年湖南中医药高等专科学校单招职业技能考试题库附答案.docx VIP
- 中国的世界文化遗产-英文版.ppt VIP
- 大连海事大学《思想道德与法治》课件-绪论、第一章-E.pptx VIP
- 医疗数据跨境传输2025年隐私保护技术路径研究.docx
- IEC62446-2:2020并网光伏系统运维标准解读.pptx VIP
- 《行政执法证据搜集与运用》课件.ppt VIP
- 供水管网施工组织设计(完整版).docx VIP
- 教学课件:高中化学 第四章 非金属及其化合物 4.3 硫和氮的氧化物(第2课时)课件 新人教版必修1.ppt VIP
- 《误差的来源与分类》课件.ppt VIP
文档评论(0)