问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

同步多线程的同步

发布网友 发布时间:2022-04-30 23:54

我来回答

1个回答

热心网友 时间:2022-04-12 14:07

1、 Event
用事件(Event)来同步线程是最具弹性的了。一个事件有两种状态:激发状态和未激发状态。也称有信号状态和无信号状态。事件又分两种类型:手动重置事件和自动重置事件。手动重置事件被设置为激发状态后,会唤醒所有等待的线程,而且一直保持为激发状态,直到程序重新把它设置为未激发状态。自动重置事件被设置为激发状态后,会唤醒“一个”等待中的线程,然后自动恢复为未激发状态。所以用自动重置事件来同步两个线程比较理想。MFC中对应的类为CEvent。CEvent的构造函数默认创建一个自动重置的事件,而且处于未激发状态。共有三个函数来改变事件的状态:SetEvent,ResetEvent和PulseEvent。用事件来同步线程是一种比较理想的做法,但在实际的使用过程中要注意的是,对自动重置事件调用SetEvent和PulseEvent有可能会引起死锁,必须小心。
多线程同步-event
在所有的内核对象中,事件内核对象是个最基本的。它包含一个使用计数(与所有内核对象一样),一个BOOL值(用于指明该事件是个自动重置的事件还是一个人工重置的事件),还有一个BOOL值(用于指明该事件处于已通知状态还是未通知状态)。事件能够通知一个线程的操作已经完成。有两种类型的事件对象。一种是人工重置事件,另一种是自动重置事件。他们不同的地方在于:当人工重置的事件得到通知时,等待该事件的所有线程均变为可调度线程。当一个自动重置的事件得到通知时,等待该事件的线程中只有一个线程变为可调度线程。
当一个线程执行初始化操作,然后通知另一个线程执行剩余的操作时,事件使用得最频繁。在这种情况下,事件初始化为未通知状态,然后,当该线程完成它的初始化操作后,它就将事件设置为已通知状态,而一直在等待该事件的另一个线程在事件已经被通知后,就变成可调度线程。
当这个进程启动时,它创建一个人工重置的未通知状态的事件,并且将句柄保存在一个全局变量中。这使得该进程中的其他线程能够非常容易地访问同一个事件对象。程序一开始创建了三个线程,这些线程在初始化后就被挂起,等待事件。这些线程要等待文件的内容读入内存,然后每个线程都会访问这段文件内容。一个线程进行单词计数,另一个线程运行拼写检查,第三个线程运行语法检查。这3个线程函数的代码的开始部分都相同,每个函数都调用WaitForSingleObject.,这将使线程暂停运行,直到文件的内容由主线程读入内存为止。一旦主线程将数据准备好,它就调用SetEvent,给事件发出通知信号。这时,系统就使所有这3个辅助线程进入可调度状态,它们都获得了C P U时间,并且可以访问内存块。这3个线程都必须以只读方式访问内存,否则会出现内存错误。这就是所有3个线程能够同时运行的唯一原因。如果计算机上配有三个以上CPU,理论上这个3个线程能够真正地同时运行,从而可以在很短的时间内完成大量的操作
如果你使用自动重置的事件而不是人工重置的事件,那么应用程序的行为特性就有很大的差别。当主线程调用S e t E v e n t之后,系统只允许一个辅助线程变成可调度状态。同样,也无法保证系统将使哪个线程变为可调度状态。其余两个辅助线程将继续等待。已经变为可调度状态的线程拥有对内存块的独占访问权。
让我们重新编写线程的函数,使得每个函数在返回前调用S e t E v e n t函数(就像Wi n M a i n函数所做的那样)。
当主线程将文件内容读入内存后,它就调用SetEvent函数,这样操作系统就会使这三个在等待的线程中的一个成为可调度线程。我们不知道系统将首先选择哪个线程作为可调度线程。当该线程完成操作时,它也将调用S e t E v e n t函数,使下一个被调度。这样,三个线程会以先后顺序执行,至于什么顺序,那是操作系统决定的。所以,就算每个辅助线程均以读/写方式访问内存块,也不会产生任何问题,这些线程将不再被要求将数据视为只读数据。
这个例子清楚地展示出使用人工重置事件与自动重置事件之间的差别。
P u l s e E v e n t函数使得事件变为已通知状态,然后立即又变为未通知状态,这就像在调用S e t E v e n t后又立即调用R e s e t E v e n t函数一样。如果在人工重置的事件上调用P u l s e E v e n t函数,那么在发出该事件时,等待该事件的任何一个线程或所有线程将变为可调度线程。如果在自动重置事件上调用P u l s e E v e n t函数,那么只有一个等待该事件的线程变为可调度线程。如果在发出事件时没有任何线程在等待该事件,那么将不起任何作用 。 2、 Critical Section
使用临界区域的第一个忠告就是不要长时间锁住一份资源。这里的长时间是相对的,视不同程序而定。对一些控制软件来说,可能是数毫秒,但是对另外一些程序来说,可以长达数分钟。但进入临界区后必须尽快地离开,释放资源。如果不释放的话,会如何?答案是不会怎样。如果是主线程(GUI线程)要进入一个没有被释放的临界区,呵呵,程序就会挂了!临界区域的一个缺点就是:Critical Section不是一个核心对象,无法获知进入临界区的线程是生是死,如果进入临界区的线程挂了,没有释放临界资源,系统无法获知,而且没有办法释放该临界资源。这个缺点在互斥器(Mutex)中得到了弥补。Critical Section在MFC中的相应实现类是CcriticalSection。CcriticalSection::Lock()进入临界区,CcriticalSection::UnLock()离开临界区。 3、 Mutex
互斥器的功能和临界区域很相似。区别是:Mutex所花费的时间比Critical Section多的多,但是Mutex是核心对象(Event、Semaphore也是),可以跨进程使用,而且等待一个被锁住的Mutex可以设定TIMEOUT,不会像Critical Section那样无法得知临界区域的情况,而一直死等。MFC中的对应类为CMutex。Win32函数有:创建互斥体CreateMutex() ,打开互斥体OpenMutex(),释放互斥体ReleaseMutex()。Mutex的拥有权并非属于那个产生它的线程,而是最后那个对此Mutex进行等待操作(WaitForSingleObject等等)并且尚未进行ReleaseMutex()操作的线程。线程拥有Mutex就好像进入Critical Section一样,一次只能有一个线程拥有该Mutex。如果一个拥有Mutex的线程在返回之前没有调用ReleaseMutex(),那么这个Mutex就被舍弃了,但是当其他线程等待(WaitForSingleObject等)这个Mutex时,仍能返回,并得到一个WAIT_ABANDONED_0返回值。能够知道一个Mutex被舍弃是Mutex特有的。 4、 Semaphore
信号量是最具历史的同步机制。信号量是解决procer/consumer问题的关键要素。对应的MFC类是Csemaphore。Win32函数CreateSemaphore()用来产生信号量。ReleaseSemaphore()用来解除锁定。Semaphore的现值代表的意义是可用的资源数,如果Semaphore的现值为1,表示还有一个锁定动作可以成功。如果现值为5,就表示还有五个锁定动作可以成功。当调用Wait…等函数要求锁定,如果Semaphore现值不为0,Wait…马上返回,资源数减1。当调用ReleaseSemaphore()资源数加1,当然不会超过初始设定的资源总数。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
寒露前后种大蒜可以吗寒露前后能不能种大蒜 三个数短除法需要注意什么? 饭后多久泡脚好 饭后多久泡脚最佳时机 饭后多久泡脚好 买个CPU,有点纠结,E3和i7有什么区别,求大神讲解,推荐一款 i7和e3到底谁好 输入不了大写字母怎么办? 为什么会这样呢 我用我自己的QQ号 ...进行解绑时绑定了自己的QQ号为什么输入QQ号它显示请输入孩子的... Discuz(5d6d)论坛如何搬至新空间【高分急求】 奶茶店招长期工干三四个月算不算长期? 什么是线程的同步?为什么要实现线程的同步? 如何实现if语句中几个线程的同步 java 题目 什么是线程?如何实现多线程?如何实现线程同步? 说得具体些,通俗些。 Java如何实现多线程同步? 多线程有几种实现方法,都是什么?同步有几种实现方法,都是什么? 低头即是海,抬头便是山是什么意思 《大灌篮》中的那个曾志伟的女儿是谁?好可爱哦~ 曾志伟女儿图片 曾宝仪是曾志伟的女儿吗? 多线程如何同步 曾志伟女儿罕见亮相,自曝48岁还未嫁的原因,究竟有何隐情? 蓝莓是水果吗,还是什么东西 曾志伟的女儿47岁,不结婚也不生孩子,如今怎样了? 曾志伟感情生活混乱,为什么女儿从不怨恨他? 曾志伟的女儿曾宝仪,现在状况如何? 曾志伟大女儿不结婚不生子,越来越像曾志伟,曾宝仪现在过得怎么样? 水果有什么特点写作文 宣纸有没有别称?分别是哪些? 曾志伟的女儿是阿雅吗? 30个鹅蛋放多少盐多少水 求助一下去外面奶茶店打工大概一天需要干多长时间。需不需要加班 请问正常家用厨房水龙头,24小时不间断放水,10天能放掉多少吨水。 delphi 怎么实现多线程的同步 今天下午两点到四点下雨吗? 认为奶茶店长期和短期的界限是多久? 高考中的提前批综合评价招生会不会影响第一志愿 比如综合评价不行了 奶茶店都要工作十个小时? 2021年报了山大的综合评价招生过了不去面试会对高考有影响吗 综合素质评价招生模式更公平吗? 在一家私人的奶茶店上班,每天上十一个小时,每个月只有两千块,想直接走人不干了? 综合素质评价乱写有什么后果? 做火锅用调料 奶茶店上班累不累? 学生综合素质评价对高考录取有什么影 综合素质评定对录取有影响吗 奶茶店店员适合长期干吗? 奶茶店每天工作时间13个小时,上三天休一天,时间合理吗? 53岁的女人还能怀孕么 2000元左右的手机买哪款比较好?