如果从其他线程访问(读/写)src缓冲区,是否有可能从memcpy获得访问冲突
Is there any chance to get access violation from memcpy, if src buffer is accessed(read/write) from other thread
我的应用程序违反了访问问题。
调用堆栈:
0da0ccfc 77c46fa3 ntdll!KiUserExceptionDispatcher+0xe
0da0d004 4dfeee3a msvcrt!memcpy+0x33
0da0d45c 4dfdbc4b MyLibrary!MyClass::MyFunc+0x8d [MyFile.cpp @ 574]
[MyFile.cpp @ 574 memcpy( m_pMyPointer, m_pSrcPointer, m_nDataSize);
在这里,我确定以下内容..m_pMyPointer是有效的,任何其他线程都不会读取或写入此内存。m_pMyPointer的大小大于 m_nDataSize。m_pSrcPointer可以从其他线程(读取或写入)访问,m_pSrcPointer的大小小于m_nDataSize的可能性很小。
我的疑问是,如果任何其他线程试图读取/写入m_pSrcPointer,是否有任何理由从memcpy(m_pMyPointer,m_pSrcPointer,m_nDataSize)获得访问违规。由于memcpy()读取m_pSrcPointer,而不是写入它。
我会排除这一点。根据定义,对内存区域的并发读取访问是线程安全的。当一个线程写入另一个线程读取的内存位置时,您将失去线程安全,因为结果是不可预测的,但您仍然不应该遇到访问冲突(在大多数健全的平台中,包括 x86)。
最有可能的是,m_pMyPointer
或m_pSrcPointer
指向的有效内存区域的大小小于 m_nDataSize
。
但是,如果您怀疑同一块内存是否同时由不同的线程读取和写入,则意味着您至少缺少锁定方案。
如果并发线程仅更改缓冲区中的数据,则不应通过从缓冲区复制/复制到缓冲区来获取任何 AV。
如果并发线程更改指向缓冲区的指针或包含缓冲区大小(字节数或元素数)的变量,则可以使用这些指针和大小变量通过复制到缓冲区或从缓冲区复制轻松获取 AV。在这里,你进入了未定义行为的领域。
可能性很小。如果写入m_srcPtr不是原子的,或者另一个线程正在写入其他成员之一,而您还没有告诉我们(例如,m_nDataSize听起来像是可能的事情)。
如果写入m_srcPtr不是原子的,则根据您的体系结构,在对指针的 2 次写入之间可能会暂时有一个无效的指针。如果m_nDataSize与m_srcPtr"同时"更新,那么您就有很多机会发生不好的事情。
请注意,这是高度依赖于体系结构的。
- 是否可以从 OpenGL 缓冲区获取原始大小的像素?
- 是否可以在 OpenGL 中的同一调用中呈现两个具有不同索引起点的不同缓冲区?
- 是否可以将 std::basic_ifstream 和 std::basic_ofstream 与自定义缓冲区一起使用?
- 是否可以在C++中拼接缓冲区,零拷贝?
- std::vector::assign/std::vector::operator=(const&) 是否保证在"this"中重用缓冲区?
- 输出操纵器 std::ends 是否向输出缓冲区添加空字符?
- 是否可以等待来自暂存缓冲区的传输完成而不调用 vkQueueWaitIdle
- Qt是否能够支持小缓冲区低延迟视频应用(例如实时流)
- C 文本写入随机数据.是否有缓冲区溢出
- 在C 中,是否有可能在不兼容类型的std ::向量对象之间传输不同类型的缓冲区
- 我是否需要删除传递给谷歌协议缓冲区(protobuf)的对象
- 是否可以在同一设备缓冲区上一个接一个地调用 OpenCL 内核?
- 当构建器被销毁时,缓冲区是否有效
- 使用大长度缓冲区初始化字符串流是否会使内存使用量加倍
- 如何检查输入缓冲区是否为空
- 如何检查 cin 缓冲区是否包含相同的值 0.5 秒 (C++)
- 将新放置到缓冲区后,缓冲区和实例是否具有相同的 void* 地址?
- 是否存在以相反顺序填充缓冲区的MEMSET函数
- 是否可以在键盘输入缓冲区中向前看并在MFC/Win32中检测条形码条目
- 换行符是否也会刷新缓冲区?