2014-10-06 16 views
6

này tôi đọc từ mô tả threads::shared:Perl chia sẻ các biến số nguyên tử và tầm nhìn

Theo mặc định, các biến là riêng tư cho mỗi chủ đề, và mỗi chủ đề mới được tạo ra được một bản sao riêng của mỗi biến đang tồn tại. Module này cho phép bạn chia sẻ các biến qua chủ đề khác nhau ... (more)

Hãy nói rằng tôi có một biến chia sẻ như thế này:

my $var :shared; 
$var = 10; 

Điều này có nghĩa các biến tồn tại duy nhất một lần cho tất cả các chủ đề tôi tạo .


Bây giờ về số nguyên tử và visibility:

Nếu thread_A gán một giá trị mới giả sử 11:

$var = 11; 

Có đảm bảo rằng thread_B (và tất cả các chủ đề khác mà tôi có thể đã tạo ra) sẽ thấy giá trị 11? Và bài tập được thực hiện một cách nguyên tử?

Hoặc chúng ta có như trong Java trước tiên để có được một khóa và sau đó làm nhiệm vụ và để giải phóng khóa. Và chỉ có chủ đề sử dụng cùng một khóa được đảm bảo để xem giá trị cập nhật?

Hoặc điều này hoạt động như biến nguyên thủy dễ bay hơi trong Java?

Trả lời

4

Thực hành luôn luôn tốt để thực thi nguyên tử trong bản cập nhật. Perl cung cấp lock để cho phép chúng tôi thực hiện việc này. Bạn có thể lock biến đó - nếu biến được chia sẻ với chuỗi, thì trạng thái khóa cũng vậy.

Nếu bạn cập nhật $var thì các chủ đề khác sẽ thấy giá trị mới.

Nhưng bạn có điều kiện chủng tộc tiềm năng, tùy thuộc vào thời điểm họ truy cập. Nếu đó là một vấn đề - lock và nếu nó không ... tiếp tục.

Hãy nhớ rằng các hoạt động như $var++ không được đảm bảo là nguyên tử. (http://perldoc.perl.org/perlthrtut.html#Thread-Pitfalls%3a-Races)

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