2011-06-23 26 views
12

đây là câu hỏi dành cho người mới bắt đầu tôi đoán nhưng tôi không thể tìm thấy câu trả lời cho câu hỏi cụ thể này:là < vector > luồng an toàn để đọc/ghi tại các vị trí khác nhau?

tôi có vectơ chuẩn (C++) v có kích thước 10 và nhập int.

có an toàn để thay đổi tất cả các vị trí (v.at (0) = x; v.at (2) = y; v.v.) và một chủ đề khác thay đổi tất cả các giá trị cho các vị trí lẻ (v.at (1) = a; v.at (3) = b; vv) cùng một lúc?

vì vậy, không thay đổi kích thước, không có push_back() v.v. trong suốt thời gian tồn tại của 2 luồng này.

nếu không an toàn, việc sử dụng mảng có phải là cách tốt hơn để thực hiện việc này không?

cảm ơn sự giúp đỡ của bạn.

Trả lời

10

vector không cung cấp bất kỳ bảo đảm thread-an toàn, vì vậy về mặt kỹ thuật câu trả lời sẽ là không.

Trong thực tế, bạn sẽ có thể thoát khỏi nó ... cho đến ngày ai đó (có thể bạn) thực hiện một thay đổi nhỏ ở một góc của chương trình và tất cả các địa ngục vỡ lỏng. Tôi sẽ không cảm thấy thoải mái khi làm điều này trong bất kỳ chương trình không tầm thường nào.

+1

+1 để cố gắng tránh những đêm không ngủ sau khi ứng dụng này được phân phối và, tệ hơn, được tăng cường/duy trì: ( –

+0

cảm ơn câu trả lời của bạn. ... xem ý của bạn là gì? Mặc dù: cách bạn tiếp cận vấn đề là ý tưởng là chia một lưới khá lớn các biến thành các phần để chia sẻ thời gian tính toán.Một khóa trên toàn bộ lưới/vector sẽ làm chậm mọi thứ khá một chút –

+2

@Benthebear: Có thể từ phía đối diện ... tạo ra lưới điện trong các bộ phận, xử lý từng phần một cách độc lập với không có khóa, và cuối cùng kết hợp các kết quả.Có thể làm việc? – Jon

4

Kịch bản bạn mô tả sẽ an toàn - bạn điều khiển các phần tử riêng lẻ có kích thước cố định (vì kích thước vector sẽ không thay đổi trong các hoạt động đó), vì vậy bạn không cần bất kỳ đồng bộ hóa bổ sung nào ở vị trí đầu tiên trừ khi bạn thao tác bất kỳ phần tử nào từ nhiều hơn một chuỗi (trường hợp này không phải là trường hợp của bạn).

7

Từ MSDN: Thread Safety in the Standard C++ Library

Đối với lần đọc đến cùng một đối tượng, đối tượng là chủ đề an toàn cho việc đọc:

  • Từ một thread tại một thời điểm khi không có người viết về chủ đề khác.
  • Từ nhiều chủ đề tại một thời điểm khi không có người viết nào trên các chủ đề khác.

Đối viết để cùng một đối tượng, đối tượng là chủ đề an toàn cho các văn bản từ một thread khi không có độc giả trên đề khác

Đối với đọc các đối tượng khác nhau của cùng lớp, đối tượng là chủ đề an toàn cho việc đọc :

  • Từ một chuỗi tại một thời điểm.
  • Từ một chủ đề tại một thời điểm mà không có người viết nào trên các chủ đề khác.
  • Từ nhiều chủ đề cùng một lúc.
  • Từ nhiều chủ đề tại một thời điểm khi không có người viết nào trên các chủ đề khác.

Đối ghi vào các đối tượng khác nhau của cùng lớp, đối tượng là chủ đề an toàn cho viết:

  • Từ một thread khi không có độc giả trên các chủ đề khác.
  • Từ nhiều chủ đề.

Vì vậy, từ trên, Theorotically, NO, nó sẽ không được threadsafe.

4

Về mặt lý thuyết: Không.

Thực tế: Có (Theo cách tất cả STLS nổi tiếng được thực hiện)

5

Tùy thuộc vào máy. Nếu bạn có vector<char>, bộ xử lý có thể không tải được v [i] và v [i + 1] theo các từ riêng biệt. Bạn có thể gặp vấn đề về tính nhất quán của bộ nhớ cache.

Cả trình biên dịch và bộ xử lý đều có thể sắp xếp lại hướng dẫn, điều này có thể phá vỡ chương trình của bạn ngay cả khi những điều trên không áp dụng. This is why C++0x has a memory model.

Các vấn đề liên quan