2016-07-14 17 views
5

Tôi đã xem năm này WWDC GCD nói gần đây và tôi nghĩ rằng có một đoạn mã có gì đó không ổn. Đó là về việc tạo một chuỗi an toàn cho thuộc tính bằng cách sử dụng DispatchQueues.Đồng bộ hóa các thuộc tính trong Swift 3 bằng cách sử dụng GCD

class MyObject { 
    private var internalState: Int 
    private let internalQueue: DispatchQueue // Serial or Concurrent? 

    var state: Int { 
     get { 
      return internalQueue.sync { internalState } 
     } 

     set (newState) { 
      internalQueue.sync { internalState = newState } 
     } 
    } 
} 

Họ sử dụng một DispatchQueue để khóa một tài sản. Nhưng tôi nghĩ đoạn mã này không hợp lệ, vì internalQueue có thể đồng thời. Vì vậy, nếu chúng ta gọi setter từ hai khác nhau DispatchQueues/Threads nếu hàng đợi nội bộ đó không phải là nối tiếp, nó cũng có thể dẫn đến vấn đề luồng phải không? Bởi vì trong sự hiểu biết của tôi đồng bộ chỉ giữ thread gọi và tiếp tục nếu nhiệm vụ hoàn tất. Bạn nghĩ gì về đoạn mã này? Liệu tôi có sai?

+4

Có, bạn sẽ xác định internalQueue dưới dạng hàng đợi * nối tiếp *. –

Trả lời

6

Nhưng tôi nghĩ rằng đoạn mã này là không hợp lệ, vì internalQueue có thể đồng thời

Nhưng nó không phải là đồng thời. Công văn hàng đợi mà bạn tạo được nối tiếp theo mặc định. Đó là điểm của kỹ thuật (và ví dụ).

+0

Bạn có thể muốn xem các video WWDC trên GCD từ những năm trước đó. Họ rõ ràng hơn vào thời điểm này. – matt

+0

Cảm ơn Matt, tôi không biết điều đó. –

7

Tôi muốn chỉ hiển thị một cách tiếp cận khác giúp bạn có thể đọc đồng thời, nhưng chặn mọi thứ trong khi viết bằng cách sử dụng hàng rào công văn.

class MyObject { 
private var internalState: Int 
private let internalQueue = DispatchQueue(label: "reader-writer", attributes: .concurrent)) 

var state: Int { 
    get { 
     return internalQueue.sync { internalState } 
    } 

    set (newState) { 
     internalQueue.async(flags: .barrier) { internalState = newState } 
    } 
    } 
} 

Với cách tiếp cận đó, đọc có thể xảy ra đồng thời trên hàng đợi, nhưng viết được thực hiện độc quyền, do rào cản.

Đây chỉ là chuyển đổi Swift 3 của phương pháp được giải thích trong sách Mục tiêu hiệu quả C 2.0, được viết bởi Matt Galloway.

+1

Rất đẹp. Cũng có thể sử dụng hàng đợi đồng thời riêng tư tại đây. –

+0

[Câu hỏi này] (http://stackoverflow.com/q/38084482/819340) cung cấp thêm ngữ cảnh về tùy chọn '.barrier'. –

+0

@Rob cảm ơn bạn tôi sẽ sửa ngay bây giờ. – Andrea

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