读书人

VC++中多线程有关问题

发布时间: 2013-09-25 11:02:59 作者: rapoo

VC++中多线程问题
两个应用程序A,B
A中有1,2,3,4这四个线程,一个变量bMatch
线程1:不停的循环接收GPS数据,当数据满足一定条件之后将数据发送给B应用程序,发送数据之前将bMatch置为false
线程2:不停的循环接收外部数据,当接收到来自B应用程序的数据时,将变量bMatch置为true
线程3:不停的循环接收语音数据,当接收到语音数据后判断变量bMatch是否为true再决定是否进行语音播放操作
线程4:不停的循环接收图片数据,当接收到图片数据后判断变量bMatch是否为true再决定是否进行图片显示操作
注:a.线程1可能发了好几条数据过去,而线程2还没回第一条
b.线程1发了数据而线程2还没回的时候,线程3,4可能已经接收到语音跟图片,此时变量bMatch的值就不准确了(我需要在线程3,4接收到语音跟图片数据的时候一定要等到线程2回复之后才能执行)
c.线程1发过去三条数据,线程2一条都没回,而线程3跟线程4已经收到三条信息了,此时这三条信息很可能因为线程2还没回复而导致被忽略

问:
怎么使得线程3跟线程4接收到的语音跟图片数据能够跟线程2回复的数据相对应,并且不影响其他继续接收的语音跟图片数据 多线程 vc++
[解决办法]
你有一系列的数据,却只有一个bMatch。那么你只有控制数据,保证只有一个数据在处理中,这样,几个线程就不会把数据弄混了。这样以来,并发性会很差。

如果要提高并发性,就需要用给数据编号,并使用bMatch数组,类似TCP协议中的滑动窗口控制机制。
[解决办法]
首先一个控制变量太少了
其次 非要等到线程二处理了以后才能处理3 4 可以使用WaitForSingleObject等待Event对象
也可以while(b){...},b只能在线程2中修改为true

[解决办法]
给数据加上编号,播放语音或显示图片时,判断是否对应
[解决办法]
就用一个bMatch,当然不够了。
敢不敢多用几个控制量,线程间的控制可以用CriticalSection,Event,Mutex,Semaphore。
都可以达到效果

读书人网 >VC/MFC

热点推荐