多线程共享数据保护

王凌 2009-12-18 10:53:21
请教下多线程问题,如标题“多线程共享数据保护”。也看了以前一些朋友提的问题,以及回复。感觉还没有找到正确答案,所有再拿出来提下。
问题的提出:需求是通讯后的数据保存,我采用2个线程一个负责通讯,一个负责数据保存。通讯得到的数据放在内存中,保存的时候直接读取这里的内容。这样的情况相当于1个线程(通讯)在写内存,一个线程(保存)是在读内存。执行周期,通讯次数:保存数据次数=3:1 (既 通讯3次保存一次)。

想问的问题是:1.目前2个线程没有做互斥的保护,一个只读、一个只写。
环境A:单核CPU的情况下,理论上不可能发生写数据的同时又读数据,因此数据肯定是正确的,也不必保护。
这样理解对不?
环境B:多核CPU的情况下,理论上会发生写数据的同时又读数据,因此数据有可能是错误的,需要保护。
这样理解对不?

2.多核CPU情况下,二个线程操作同一内存区,同时读同时写是不是真的“同时”--时间完全没有先后?还是
说时间先后可以忽略?
...全文
295 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
teleinfor 2009-12-18
  • 打赏
  • 举报
回复
两个线程共享同一个内存,不管是不是多核cpu场景,你都应该使用同步控制,使用一个简单的CRITICAL_SECTION或者MUTEX即可实现你的目标。

不做同步控制是一个非常危险的事情,CPU时间调度以及内核访问不应该是你application层面考虑的问题。多核多线程,你肯定会遇到崩溃问题的,虽然概率可能很小。我以前使用过的一个产品就是这个类似的问题导致极不稳定,应该是程序员设计多线程工作模式的低级失误导致的。你应该尽可能是自己的解决方案具有基本的合理的健壮性。并且这些开销是必要的,是不足以影响效率的。
  • 打赏
  • 举报
回复
对环境A的理解理论上不可能发生写数据的同时又读数据是正确的,
但是数据不一定是正确的,你可以做一个简单的测试,启动两个线程对一个缓冲区进行操作,一个进行写,一个进行读操作,如果不加同步控制,你看一下结果会如何。
因为线程的调度本身是无法控制的,可能写线程写了100个字节后,读线程读取了30个字节,又开始写了....

对环境B的理解可以认为是正确的。

第2个情况不好说。

仅供参考。
oyljerry 2009-12-18
  • 打赏
  • 举报
回复
要知道单核,也会有多线程,从而发生线程切换,OS会做多任务处理,从而会让你读写数据发生混乱,还没写完,可能你就发生了读的操作,因而只要是有多线程读写,就应该做同步,这样才能保存逻辑顺序
zhou1xp 2009-12-18
  • 打赏
  • 举报
回复
恩,你可以在读的A线程里面将数据处理好,然后postmessage()给B线程,在post后创建一个等待事件等待A线程数据处理完成的信号,如果要速度快,应该是A线程中的算法问题

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧