Mã nàyAre 'thông số chuỗi const` (thread) an toàn
procedure MyThreadTestA(const AStr: string);
là nhanh hơn so với
procedure MyThreadTestB(AStr: string);
Trong khi làm cùng một công việc, cả hai vượt qua một con trỏ.
Tuy nhiên phiên bản B 'đúng' cập nhật referencecount của AStr
và tạo một bản sao nếu tôi thay đổi nó.
Phiên bản A qua chỉ là một con trỏ và chỉ trình biên dịch ngăn cản tôi từ việc thay đổi AStr
.
Version A là không an toàn nếu tôi làm thủ đoạn bẩn trong Assembler hoặc để phá vỡ sự bảo vệ biên dịch, điều này được nổi tiếng nhưng ...
là thông qua AStr
bằng cách tham chiếu như một const
thông số chủ đề an toàn?
gì xảy ra nếu tính tham khảo AStr
's trong một số chủ đề khác đi về không và chuỗi bị phá hủy?
Nếu số tài liệu tham khảo đi đến số không trong chủ đề khác, sau đó số lượng tài liệu tham khảo đã sai để bắt đầu với. Nếu hai phần mã có thể sửa đổi cùng một chuỗi, thì số tham chiếu của chuỗi phải lớn hơn 1 vì có nhiều cách rõ ràng để tham chiếu đến chuỗi đó. Mỗi luồng phải có biến độc lập riêng của nó để gán trọng số cho chuỗi, nếu không biến chia sẻ phải được bảo vệ bằng các kỹ thuật đồng bộ hóa thông thường. –
Câu hỏi rất hay. Tôi đã học được điều gì đó ngày hôm nay. –