gpt4 book ai didi

vector 的并发性,其中每个单元格在 32 位架构上为 8 位

转载 作者:太空宇宙 更新时间:2023-11-04 03:28:43 25 4
gpt4 key购买 nike

让我们假设有一个使用vector 的并发情况。每个线程以写入和读取模式访问数组的不同单元格。

我将展示一个“C/C++-like”代码片段,只是为了提供一个想法:

uint8_t vector[SIZE];

void thread(int id_thread) {
// vector is a global variable, same for all threads
vector[id_thread] = id_thread;
}

// Somewhere
for (i = 0; i < SIZE; ++i) {
createThread(thread, i); // create a thread and passing i as id_thread
}

想法

  • num-SIZE 个单元组成的 vector 。
  • 每个单元格的大小为 uint8_t(8 位,1 字节)。
  • 每个线程在不同的单元格中写入和读取,换句话说:不存在两个不同的线程在 vector 上重叠。

问题

假设有一个现代的、通用的 PC 架构:intel(R) 处理器 64 位。我对这些操作的安全性(并发性)有任何保证吗?

当一个单元格为 8 位时,问题就变成了这样一个事实:处理器访问内存时将 WORD(32 位或 64 位)带入其寄存器。

两个线程写入两个相邻的 vector 单元并产生幽灵写入是否会发生?或者是否有一个晦涩的(对我来说)“设计”可以避免这种情况?

[0] [0] [0] [0] ... [0]
_______________
uint8 * 4

thread1: [1] [0] [0] [0] and write in memory
thread2: [0] [1] [0] [0] and write in memory
---------------
overlap if processor write 32-bit at least.

我错了吗?处理器可以在不以任何方式接触(缓存,包括)相邻字节的情况下将单个字节写入内存?

谢谢。

最佳答案

只要它不能破坏单线程代码,编译器就可以自由地将写入实现为机器指令。例如,它可以将 32 位值读入寄存器,更改适当的字节,然后将 32 位值写回内存。这会破坏其他写入。

关于vector 的并发性,其中每个单元格在 32 位架构上为 8 位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39038041/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com