gpt4 book ai didi

C++ 并发写入 bool 数组(不是 std::vector)

转载 作者:搜寻专家 更新时间:2023-10-31 01:30:56 26 4
gpt4 key购买 nike

我正在使用 C++11,我知道并发写入 std::vector<bool> someArray由于 std::vector 的特殊化,不是线程安全的对于 bool 值。

我试图找出是否写入 bool someArray[2048]有同样的问题:

  • 假设 someArray 中的所有条目最初设置为 false
  • 假设我有一堆线程写入 someArray. 中的不同索引事实上,这些线程只是将不同的数组条目从 false 设置为 true。
  • 假设我有一个读取器线程,它在某个时刻获取了一个锁,触发了内存栅栏操作。

问:读者会看到对someArray的所有写入吗?发生在获取锁之前?

谢谢!

最佳答案

你应该使用 std::array<bool, 2048> someArray , 不是 bool someArray[2048]; .如果您在 C++11 领域,您将希望尽可能地现代化您的代码。

std::array<bool, N>不像std::vector<bool>那样特化是的,所以在原始安全方面没有任何担忧。

至于你的实际问题:

Will the reader see all the writes to someArray that occurred before the lock was acquired?

仅当数组的写入者也与锁交互时,通过在他们完成写入时释放它,或者通过更新与读取器随后同步的锁关联的值和。如果写入者从不与锁交互,那么将由读取器检索的数据是未定义的。

您还需要牢记一件事:虽然让多个线程写入同一个数组并非不安全前提是它们都写入唯一的内存地址,与缓存的交互可能会大大减慢写入速度。例如:

void func_a() {
std::array<bool, 2048> someArray{};
for(int i = 0; i < 8; i++) {
std::thread writer([i, &someArray]{
for(size_t index = i * 256; index < (i+1) * 256; index++)
someArray[index] = true;
//Some kind of synchronization mechanism you need to work out yourself
});
writer.detach();
}
}

void func_b() {
std::array<bool, 2048> someArray{};
for(int i = 0; i < 8; i++) {
std::thread writer([i, &someArray]{
for(size_t index = i; index < 2048; index += 8)
someArray[index] = true;
//Some kind of synchronization mechanism you need to work out yourself
});
writer.detach();
}
}

细节将根据底层硬件而有所不同,但在几乎所有情况下,func_a将比 func_b 快几个数量级,至少对于足够大的数组大小(选择 2048 作为示例,但它可能不能代表实际的底层性能差异)。这两个函数应该有相同的结果,但其中一个会比另一个快得多。

关于C++ 并发写入 bool 数组(不是 std::vector),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46717870/

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