您應該使用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