Nó phụ thuộc vào cách bạn xác định "mảng" và "chia sẻ".Cho đến khi mảng đi, có hai trường hợp cần phải được xem xét riêng:
- Mảng kích thước cố định (được khai báo
my @a[$size]
); điều này bao gồm các mảng đa chiều với kích thước cố định (chẳng hạn như my @a[$xs, $ys]
). Đây là những tài sản thú vị mà bộ nhớ sao lưu chúng không bao giờ phải được thay đổi kích cỡ.
- Mảng động (được khai báo
my @a
), phát triển theo yêu cầu. Đây là, dưới mui xe, thực sự sử dụng một số khối bộ nhớ theo thời gian khi chúng phát triển.
Cho đến nay như chia sẻ đi, cũng có ba trường hợp:
- Các trường hợp nhiều luồng chạm vào mảng trên cuộc đời của mình, nhưng chỉ có ai có thể chạm vào nó tại một thời điểm, do một số cơ chế điều khiển đồng thời hoặc cấu trúc chương trình tổng thể. Trong trường hợp này, các mảng không bao giờ được chia sẻ theo nghĩa "các hoạt động đồng thời sử dụng các mảng", do đó không có khả năng có một cuộc đua dữ liệu.
- Trường hợp chỉ đọc, không lười. Đây là nơi nhiều hoạt động đồng thời truy cập một mảng không phải là lười, nhưng chỉ đọc nó.
- Trường hợp đọc/ghi (bao gồm khi đọc thực sự gây ra ghi vì mảng đã được gán thứ gì đó yêu cầu đánh giá lười biếng; lưu ý điều này không bao giờ có thể xảy ra với mảng kích thước cố định vì chúng không bao giờ lười).
Sau đó chúng ta có thể tóm tắt sự an toàn như sau:
| Fixed size | Variable size |
---------------------+----------------+---------------+
Read-only, non-lazy | Safe | Safe |
Read/write or lazy | Safe * | Not safe |
Các * cho thấy sự báo trước rằng trong khi nó an toàn từ quan điểm của Perl 6, bạn dĩ nhiên phải chắc chắn rằng bạn không làm những điều xung đột với cùng một chỉ số.
Vì vậy, tóm lại, mảng kích thước cố định bạn có thể chia sẻ và gán một cách an toàn cho các phần tử khác nhau "không có vấn đề" (nhưng hãy giả sử chia sẻ sai, có thể khiến bạn phải trả một khoản phạt nặng để thực hiện). Đối với mảng động, nó chỉ an toàn nếu chúng chỉ được đọc từ trong thời gian chúng được chia sẻ, và thậm chí nếu chúng không lười (mặc dù gán mảng hầu hết là háo hức, bạn không có khả năng đánh vào tình huống đó vô tình). Viết, ngay cả với các yếu tố khác nhau, rủi ro mất dữ liệu, sự cố hoặc hành vi xấu khác do hoạt động ngày càng tăng.
Vì vậy, xem xét ví dụ ban đầu, chúng ta thấy my @copy;
và my @length;
là mảng động, vì vậy chúng tôi không được viết cho chúng trong các hoạt động đồng thời. Tuy nhiên, điều đó xảy ra, do đó, mã có thể được xác định không an toàn.
Các bài đăng khác đã có ở đây thực hiện một công việc tốt về chỉ đường theo hướng tốt hơn, nhưng không có gì đóng góp chi tiết đẫm máu.
Nguồn
2017-05-04 21:00:58
Toàn bộ điểm hứa hẹn là lời hứa trả lại một cái gì đó, bạn không cố ý trả lại bất kỳ điều gì hữu ích từ tiền tố câu lệnh 'start'. –
Nhưng 'bắt đầu' làm nhiều hơn thì chỉ trả lại một cái gì đó. Tôi quan tâm đến một phần đồng thời để chạy mã song song để tất cả các lõi CPU của tôi phải làm việc. –
Những gì tôi đang nói là giống như chọn lên một cờ lê, và sau đó sử dụng nó để đập trong một móng tay. Làm việc, ... tôi đoán vậy. –