Các giải pháp mạnh bảo là để khóa toàn bộ vector trên tất cả các hoạt động đó (có nghĩa là kiểm soát mỗi hoạt động từ khắp mọi nơi trong các mã , điều đó thực sự có nghĩa là tạo ra một vector đồng bộ).
Nó có thể là một cái gì đó đơn giản như điều này sẽ làm cho các mục đích của bạn:
int append(std::vector<int>& numbers, int number){
int retval = numbers.size();
// what if some other thread calls push_back(number) in between these calls?
numbers.push_back(number);
int newSize = numbers.size();
//this bit is as a short-cut in common, easy, cases
if(newSize = retval + 1) //no need for further complication
return retval;
while(++retval < newSize)
if(numbers[retval] == number)
return retval;
//If we get this far, numbers have been deleted, not added. More discussion below.
}
Một điều về vấn đề này là nếu chủ đề đẩy 3, 3, 3, 3 sau đó chỉ số trở lại sẽ là sai lầm, mặc dù nó vẫn sẽ là một chỉ mục cho 3. Cho dù đó là okay hay không phụ thuộc vào mục đích của bạn. Một điều nữa là nếu véc tơ bị xuất hiện hoặc bị rút ngắn trong thời gian chờ đợi, thì tốt nhất là chúng tôi sẽ đưa ra nhận xét trong đoạn mã ở trên, tệ hơn là lỗi (khi chúng bật lại sau khi chúng tôi nhận được newSize và sau đó truy cập [retval] trở thành không hợp lệ). Bạn cần phải xem xét nếu trường hợp này có thể xảy ra (có thể bạn biết từ phần còn lại của mã mà nó sẽ không bao giờ) và phải làm gì nếu nó xảy ra.
Nếu các giới hạn này quá lớn đối với trường hợp sử dụng của bạn, thì việc tạo ra một vectơ được đồng bộ hóa hoàn toàn là điều tốt nhất tôi có thể nghĩ là tôi sợ.
Nguồn
2010-08-10 09:28:25
Thực ra, sẽ không dễ nếu push_back() trả về một chỉ mục, vì push_back() không phải là chủ đề an toàn –
Bạn cần bảo vệ vùng chứa của mình khỏi tất cả các ghi đồng thời. Đồng thời push_back() đã cần đồng bộ hóa bên ngoài vector –
Ghi nhớ rằng đối với nhiều ứng dụng trong thế giới thực, làm cho các hoạt động an toàn luồng nhỏ không phải là giải pháp đúng: bạn nên cân nhắc việc bảo vệ các đoạn mã lớn hơn.Bộ sưu tập chủ đề an toàn là tốt nếu bạn đang sử dụng chúng như một cơ chế truyền thông. Điều đó nói rằng, điều này cũng có thể là một trường hợp như vậy. –