有问题, 多核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; 请问是否有问题?
其实还是需要结合实际业务需求的!如果不想出现不必要的bug,还是建议加上锁吧! 安全可靠点!
因为你不知道你的编译器会生成什么样的汇编指令,所以你不能单纯的依赖C++代码,推测线程之间的同步关系。 编译器不知道你在多个线程之间有共享数据,它不知道你在一个线程中写的数据,另外一个线程会使用。写的线程可能只是把数据写到寄存器或者缓存中,而不产生写入内存的指令;读的线程也可能只是从寄存器或者缓存中读取,而不产生读取内存的指令。 不是说读写本身会导致未定义行为,是你使用这些数据时,特别是依赖于这些数据有效性的代码,可能导致未定义行为。多核CPU下的特殊性是多个CPU同时执行的指令(每个指令分为数个步骤)可能涉及同一个内存地址。如果两个线程同时写,那么最终结果什么值都有可能。仅分别读写,读到的数据可能是改之前的也可能是改之后的。
有可能是读的过程中,正在写数据,读时候判断的长度和内容,读的过程中另一个线程会改写,最好是加锁,这是习惯问题。看看这篇文章吧,http://www.doc88.com/p-330763974969.html
一个线程对一个char 字符数组更新数据,主线程会读取这个数组的数据,但是,读之前都会进判空, 比如char g_str[200]={'0'}; 线程一 update g_str 主线程 if(!g_str[0]) return; 请问是否有问题?
69,373
社区成员
243,080
社区内容
加载中
试试用AI创作助手写篇文章吧