多线程问题,过来瞧瞧

wintree 2013-11-01 07:52:16
一个线程对一个char 字符数组更新数据,主线程会读取这个数组的数据,但是,读之前都会进判空,
比如char g_str[200]={'0'};

线程一
update g_str

主线程

if(!g_str[0])
return;

请问是否有问题?

...全文
324 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
wintree 2013-11-02
  • 打赏
  • 举报
回复
引用 3 楼 lunat 的回复:
有问题, 多核CPU下,多线程单纯读写字节都会造成未定义动作。 就算是单核CPU,因为你不能确定主线程执行if(!g_str[0])return;时,线程一是否正在对g_str进行操作,所以依据这个判断做出的任何假设都不具有有效性。 [quote=引用 楼主 wallwind 的回复:] 一个线程对一个char 字符数组更新数据,主线程会读取这个数组的数据,但是,读之前都会进判空, 比如char g_str[200]={'0'}; 线程一 update g_str 主线程 if(!g_str[0]) return; 请问是否有问题?
[/quote] 开启的线程单纯的写。主线程只去读。。。会有未定义行为么?
qq120848369 2013-11-02
  • 打赏
  • 举报
回复
加锁吧, 锁本身损耗不大, 竞争锁引起的等待代价比较高, 看大约有多少时间多少机会是会引发竞争.
wintree 2013-11-02
  • 打赏
  • 举报
回复
引用 13 楼 max_min_ 的回复:
其实还是需要结合实际业务需求的!如果不想出现不必要的bug,还是建议加上锁吧! 安全可靠点!
加锁的确是安全可靠。就是因为 上级觉得我不加锁,不行。把我一竿子否定。。。 加锁是最好的。我知道。谢谢了
max_min_ 2013-11-02
  • 打赏
  • 举报
回复
其实还是需要结合实际业务需求的!如果不想出现不必要的bug,还是建议加上锁吧! 安全可靠点!
wintree 2013-11-02
  • 打赏
  • 举报
回复
引用 8 楼 lunat 的回复:
因为你不知道你的编译器会生成什么样的汇编指令,所以你不能单纯的依赖C++代码,推测线程之间的同步关系。 编译器不知道你在多个线程之间有共享数据,它不知道你在一个线程中写的数据,另外一个线程会使用。写的线程可能只是把数据写到寄存器或者缓存中,而不产生写入内存的指令;读的线程也可能只是从寄存器或者缓存中读取,而不产生读取内存的指令。 不是说读写本身会导致未定义行为,是你使用这些数据时,特别是依赖于这些数据有效性的代码,可能导致未定义行为。多核CPU下的特殊性是多个CPU同时执行的指令(每个指令分为数个步骤)可能涉及同一个内存地址。如果两个线程同时写,那么最终结果什么值都有可能。仅分别读写,读到的数据可能是改之前的也可能是改之后的。
引用 7 楼 liquanhai 的回复:
有可能是读的过程中,正在写数据,读时候判断的长度和内容,读的过程中另一个线程会改写,最好是加锁,这是习惯问题。看看这篇文章吧,http://www.doc88.com/p-330763974969.html
是,之前是想加锁来着,但是我觉得加锁解锁影响我的效率。 另外读线程,即使读到脏数据 ,主线程都没关系,
angel_su 2013-11-02
  • 打赏
  • 举报
回复
看业务逻辑,如果主线程有其他活可干,循环检测是可以简单不上锁,确定要进一步读取再加锁。不过你直接return,看不出是啥逻辑...
modyaj 2013-11-02
  • 打赏
  • 举报
回复
有问题 判空时候就算正确 读取的时候另一个线程正好修改了
lunat 2013-11-02
  • 打赏
  • 举报
回复
因为你不知道你的编译器会生成什么样的汇编指令,所以你不能单纯的依赖C++代码,推测线程之间的同步关系。 编译器不知道你在多个线程之间有共享数据,它不知道你在一个线程中写的数据,另外一个线程会使用。写的线程可能只是把数据写到寄存器或者缓存中,而不产生写入内存的指令;读的线程也可能只是从寄存器或者缓存中读取,而不产生读取内存的指令。 不是说读写本身会导致未定义行为,是你使用这些数据时,特别是依赖于这些数据有效性的代码,可能导致未定义行为。多核CPU下的特殊性是多个CPU同时执行的指令(每个指令分为数个步骤)可能涉及同一个内存地址。如果两个线程同时写,那么最终结果什么值都有可能。仅分别读写,读到的数据可能是改之前的也可能是改之后的。
liquanhai 2013-11-02
  • 打赏
  • 举报
回复
有可能是读的过程中,正在写数据,读时候判断的长度和内容,读的过程中另一个线程会改写,最好是加锁,这是习惯问题。看看这篇文章吧,http://www.doc88.com/p-330763974969.html
FancyMouse 2013-11-02
  • 打赏
  • 举报
回复
读出来脏数据能正确处理的话那可以不锁
AnYidan 2013-11-01
  • 打赏
  • 举报
回复
共享资源应该加锁,除非你确定读写都是原子操作或不可被打断
lunat 2013-11-01
  • 打赏
  • 举报
回复
有问题, 多核CPU下,多线程单纯读写字节都会造成未定义动作。 就算是单核CPU,因为你不能确定主线程执行if(!g_str[0])return;时,线程一是否正在对g_str进行操作,所以依据这个判断做出的任何假设都不具有有效性。
引用 楼主 wallwind 的回复:
一个线程对一个char 字符数组更新数据,主线程会读取这个数组的数据,但是,读之前都会进判空, 比如char g_str[200]={'0'}; 线程一 update g_str 主线程 if(!g_str[0]) return; 请问是否有问题?
  • 打赏
  • 举报
回复
一个线程写,一个线程读,难道不加锁
max_min_ 2013-11-01
  • 打赏
  • 举报
回复
没有问题!但是有点浪费!当数据没有发什么变法的时候,就不需要再进行主线程的判断! 所以在线程一应该更新到一个局部变量,全局量来上一次更新的数据!

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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