7

Tôi cần trợ giúp trong việc hiểu mối quan hệ đồng bộ hóa. Tôi càng đọc nó một ví dụ để hiểu ví dụ, tôi càng cảm thấy mình không hiểu gì cả. Đôi khi tôi cảm thấy rằng ở đây là nó, tôi đã có nó, nhưng sau khi nhìn vào một ví dụ khác tôi bị lẫn lộn một lần nữa. Xin hãy giúp tôi làm đúng. Người ta nói rằng một hoạt động A đồng bộ hóa với một hoạt động B nếu A là một cửa hàng cho một số biến nguyên tử m, với ngữ nghĩa phát hành, B là một tải từ cùng biến m, với các ngữ nghĩa có được, và B đọc giá trị lưu trữ bởi A. Nó cũng nói rằng một hoạt động một xảy ra-trước khi phẫu thuật B nếuđồng bộ hóa với, xảy ra trước khi mối quan hệ và ngữ nghĩa phát hành thu được

  • A được thực hiện trên các chủ đề tương tự như B, và A là trước khi B theo thứ tự chương trình, hoặc
  • một Đồng bộ -với B hoặc
  • Điều xảy ra trước khi một số hoạt động C khác và C xảy ra trước B

OK. Nếu chúng ta xem ví dụ này

thread0 thực hiện | thread1 thực hiện


lưu trữ x (phát hành) | tải x (có được)

lưu trữ ở đây x đồng bộ hóa với tải từ x? Nếu chúng ta có mối quan hệ đồng bộ hóa ở đây, thì lưu trữ thành x xảy ra trước khi tải từ x, vì vậy mọi thứ được sắp xếp trước khi lưu trữ thành x trong chuỗi 0 xảy ra trước khi tải từ x trong chuỗi 1. Nó có nghĩa là có lệnh bắt buộc tại đây. Đúng không? Nhưng trong trường hợp này tôi không hiểu cái gì "và B đọc giá trị được lưu trữ bởi A" một phần của định nghĩa nghĩa là gì? Nếu thread 1 nhanh hơn thì thread 0 nó có thể đọc giá trị cũ. Vậy mối quan hệ ở đây là gì và có mối quan hệ nào không? Nếu không có, làm thế nào tôi có thể cung cấp mối quan hệ đó?

Xin cảm ơn trước.

+0

bài viết tuyệt vời ở đây http://preshing.com/20130823/the-synchronizes-with-relation/ – camino

Trả lời

4

Tôi không thể nói rằng tôi cũng quen thuộc với thuật ngữ này, nhưng đây là cách tôi nghĩ rằng nó đi. Tôi sẽ sử dụng các định nghĩa .NET cho các thuật ngữ: "Một hoạt động có được ngữ nghĩa nếu các bộ vi xử lý khác sẽ luôn thấy hiệu ứng của nó trước bất kỳ hiệu ứng hoạt động tiếp theo nào. Một hoạt động đã phát hành ngữ nghĩa nếu các bộ xử lý khác sẽ thấy mọi hiệu ứng của hoạt động trước đó trước hiệu ứng của "

Không có thứ tự được thực thi giữa cửa hàng và tải trong ví dụ. Hoặc là một trong những có thể được thực hiện đầu tiên. Một đồng bộ hóa với B khi hoạt động lưu trữ xảy ra được thực hiện trước khi tải. Khi điều này xảy ra, tất cả các hoạt động trước khi cửa hàng (phát hành) được đảm bảo được thực hiện trước khi các hoạt động sau khi tải (có được) được thực hiện.

Tuy nhiên, hoạt động tải có thể được thực hiện trước cửa hàng. Trong trường hợp đó A không đồng bộ hóa với B (như điều kiện "và B đọc giá trị được lưu trữ bởi A" là không đúng) và do đó các hoạt động sau khi tải có thể được thực thi trước các hoạt động trước cửa hàng. Thứ tự là mơ hồ.

Ngữ nghĩa phát hành đảm bảo rằng với giá trị nhất định của x chúng ta sẽ biết rằng các hoạt động trước cửa hàng sẽ được thực thi trước khi chúng ta có thể tải cùng một giá trị được lưu trữ trong chuỗi thứ hai (và trước khi chúng ta có thể thực hiện các hoạt động sau tải).

Giả sử rằng số và cờ được khởi tạo bằng không và cả hai chủ đề được chạy song song:

thread0: 
st   count, 1 (A) 
st.release flag, 1 (B) 

thread1: 
ld.acquire flag  (C) 
ld   count  (D) 

Chúng ta biết rằng A xảy ra-trước khi B và C sẽ xảy ra-trước D, vì thứ tự của chúng được buộc bởi việc phát hành và thu nhận ngữ nghĩa. Thứ tự của B và C là không xác định. Nó chỉ trở thành được định nghĩa khi B đồng bộ hóa với C và sau đó chúng ta biết rằng A xảy ra trước D (khi A xảy ra trước khi B xảy ra trước khi C xảy ra trước D).

Trong chuỗi1 số đếm luôn là 1 nếu cờ là 1. Nếu cờ là 0 thì số đếm có thể bằng 0 hoặc 1. Chúng tôi có thể kiểm tra cờ để xác định xem chuỗi kia đã đặt giá trị cho số chưa.

Không thu nhận và giải phóng ngữ nghĩa, tải và cửa hàng có thể được sắp xếp lại và cả cờ và số đếm có thể là 0 hoặc 1 không phụ thuộc lẫn nhau.

Nếu chúng ta muốn đảm bảo rằng B xảy ra trước C, chúng ta có thể sử dụng các ẩn dụ hoặc một số cơ chế chờ và tín hiệu khác. Trong ví dụ trước, chúng ta có thể thực thi thứ tự bằng cách bận chờ đợi cờ được thiết lập.

thread1: 
ld.acquire flag  (C) 
repeat C while flag == 0 
ld   count  (D) 
Các vấn đề liên quan