您应该使用std::array<bool, 2048> someArray
而不是bool someArray[2048];
。如果您使用的是C++ 11版本,则需要尽可能多地更新代码。
std::array<bool, N>
与std::vector<bool>
相同,因此在原始安全性方面没有问题。
至于你的实际问题:
将读者看到所有的写操作someArray
被收购的锁之前发生的?
只有当作家到阵列还与锁交互,无论是在他们写完的时候释放它,或者通过更新与锁读者然后同步关联的值。如果编写者从不与锁进行交互,那么读取器将检索的数据是未定义的。
有一件事你还需要牢记:虽然它并不不安全有多个线程写入同一阵列,前提是它们都写入唯一存储器地址,写作可以很慢通过与高速缓存的交互显着。例如:
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被选为一个例子,但它可能不代表实际的潜在性能差异)。这两个函数应该有相同的结果,但其中一个会比另一个快得多。
如果您需要线程安全性,请使用['std :: atomic_bool'](http://en.cppreference.com/w/cpp/atomic/atomic)并将其称为完成 – Mgetz