Tôi đã đọc on Stackoverflow rằng không có thùng chứa STL nào an toàn chỉ để viết. Nhưng điều đó có nghĩa là gì trong thực tế? Nó có nghĩa là tôi nên lưu trữ dữ liệu ghi trong mảng đồng bằng?Chủ đề an toàn của việc viết std :: vectơ so với mảng đồng bằng
Tôi mong đợi các cuộc gọi đồng thời tới std::vector::push_back(element)
có thể dẫn đến cấu trúc dữ liệu không nhất quán vì nó có thể dẫn đến việc thay đổi kích thước vectơ. Nhưng những gì về một trường hợp như thế này, nơi thay đổi kích thước không được tham gia:
1) sử dụng một mảng:
int data[n];
// initialize values here...
#pragma omp parallel for
for (int i = 0; i < n; ++i) {
data[i] += func(i);
}
2) sử dụng một 'std :: vector``:
std::vector<int> data;
data.resize(n);
// initialize values here...
#pragma omp parallel for
for (int i = 0; i < n; ++i) {
data[i] += func(i);
}
Việc triển khai đầu tiên có thực sự tốt hơn cái thứ hai a) về an toàn luồng và b) về hiệu suất không? Tôi muốn sử dụng một std :: vector, vì tôi ít thoải mái với các mảng kiểu C.
CHỈNH SỬA: Tôi đã xóa #pragma omp atomic update
bảo vệ ghi.
Tôi không chắc chắn đủ để làm cho nó là một câu trả lời, nhưng tôi khá chắc chắn bằng văn bản cho các yếu tố khác nhau của một 'std :: vector' là thread-safe. – Angew
Hai đoạn mã này đều an toàn. –
"Nhưng điều đó có nghĩa là gì trong thực tế?" : Nó có nghĩa là một thùng chứa phải được chốt độc quyền cho cả hai ghi * và * đọc nếu có/hoặc hoạt động trùng với một ** viết ** đồng thời. Bạn có thể có tất cả các độc giả đập vào một thùng chứa mà bạn muốn, nhưng ngay sau khi viết * tiềm năng * được giới thiệu, tất cả các phiên cược bị tắt và bạn phải chốt xuống * tất cả * truy cập (không chỉ các nhà văn khác). Khóa đơn ghi nhiều lần hoạt động tốt cho điều này, btw. – WhozCraig