注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

还东国的博客

行之苟有恒,久久自芬芳

 
 
 

日志

 
 

Qt中SIGNAL的问题  

2015-01-23 14:56:27|  分类: C++(VC)编程 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
Qt中SIGNAL的问题
在QT中使用SIGNAL和在WIN下使用MSG一样,他们都可以传送比较简单的参数,这样就可以保证异步的在多个线程之间同步数据。但是这里面还是有坑的,最近就发现同事的QT里遇到了这样一个坑。使用情况是这样的:
有两个线程,一个线程负责发送实时数据,另外一个线程发送控制数据。这两者发送的都是数组,或者说,发送的都是数据的指针。他们都使用一个共同的发送函数,更为重要的是,其在这个公用的发送函数里做了控制如下:
                         std::lock_guard<std::mutex> lock(mutex);
                         SendData(buf);//buf  是一个char*指针

这会有什么问题呢?
如果两个线程几乎同时到达要发送数据,而此时发送函数正在发送一个buf,这意味着什么?同时到达的两个线程发送的指针会前后到来,但是由于锁的原因,线程会阻塞在之前,那么后来的指针一定会替代新来的指针?不是说函数是公开的,栈上会自动保存上下文么,那不和这里说得相反了。哪个对呢。都对。前者这里没有讲清楚一个重要的点,就是SIGNAL,这两个线程所得来的指针,都是通过同一个SIGNAL来得到的。而这同一个信号使用的是同一个缓冲区,不同线程操作向同一缓冲区内添加数据,所以传过来的时候儿虽然是同一个缓冲区的指针,但数据已经不对了。归根到底,还是缓冲区使用的不好。
一开始把他认为成了同一个信号传递过来,会产生指针冲刷,但是在测试的过程中发现,信号和消息是有一个队列的,先后到达。不会产生这样的结果。(如果在消息里,同步的更不会产生这样的效果,因为同步如果不返回程序会阻塞住的)
好好得学习啊。
  评论这张
 
阅读(276)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017