【发布时间】:2019-09-13 12:22:26
【问题描述】:
假设我有一个std::vector<Item> 类成员变量,其中Item 是一些带有getter 和setter 的类。
它在一个线程 (#1) 中创建,但从另一个线程 (#2) 填充push_backs。最后它在线程#1 中被读取。对它的访问仅与 Windows event objects 同步。当向量被填满时,该事件被设置为信号状态。
在这种情况下,我应该注意跨线程可见性问题(获取陈旧值)吗?如果是,如何预防这些问题?
【问题讨论】:
-
#1 将如何对阵列进行操作?永远填充向量?还是会第二次添加项目?如果是这种情况,您还需要锁,事件是不够的。
-
@AndreaRossini #1 只是创建向量,然后运行 #2 并在完成后(即事件发出信号)读取结果。
-
如果我理解正确并且线程 #2 在发出事件信号后停止访问向量(或完全停止执行),则不需要进一步同步。
-
也许你可以创建一个minimal reproducible example。由于您正在以序列化的方式做两件事,因此根本不知道为什么这是线程化的。
-
事件更多是用于通知。如果我不使用您的事件但可以访问您的二进制文件,我想我可能会把事情搞砸。 Windows 中还有很多其他的同步对象:docs.microsoft.com/en-us/windows/win32/sync/…。 “关键部分”通常用于同步访问成员状态。
标签: c++ windows multithreading concurrency memory-model