你用的库应该至少有配置对入队时做写屏障,出队时做读屏障
【 在 Maksim 的大作中提到: 】
: 有一个问题忽然有点糊涂,发上来请教一下。
: 我有一个 concurrent queue,生产者把消息的值设置好,enqueue,消费者 dequeue,然后处理。处理完消息被回收,重复使用。我理解 concurrent queue 里面的原子操作负责保证指令不会乱序,即:消息置值的指令领先于进队的指令,处理消息的指令落后于出队的指令。我想到还有一个可见性的问题:怎么保证消费者在访问消息struct里变量时,看到的是最新的值,而不会因为线程用了本地缓存看到过期的值?我能想到的是把消息里的变量变为 std::atomic,利用 store, load 保证不同核之间同步。如果有变量大于 64 位,则只能依赖 mutex?
: 但又觉得有些多余,因为感觉 concurrent queue/message passing 本身就是一种同步模型了。这里消息成员变量的 std::atomic/mutex 是必须的么?
--
FROM 112.17.240.*