Vì bản thân tôi hơi bối rối, tôi bắt đầu bằng cách làm rõ một vài khái niệm trong câu hỏi.
Bộ sưu tập . Tôi thấy không có lý do gì để dành thời gian xác định chặt chẽ "bộ sưu tập" nghĩa là gì khi chúng ta có thể đơn giản hỏi điều gì xảy ra đối với các cấu trúc dữ liệu nói chung. Một cấu trúc dữ liệu chiếm một phần bộ nhớ và có một số thao tác có thể truy cập vào bộ nhớ đó và có thể được người dùng gọi ra . Những người dùng này có thể là bộ xử lý riêng biệt hoặc chỉ là các luồng khác nhau, nó không liên quan đến chúng tôi. Tất cả vấn đề là họ có thể thực hiện các hoạt động song song.
Khóa miễn phí . Herlihy và Boss nói rằng cấu trúc dữ liệu không bị khóa khi người dùng gặp sự cố không ngăn chặn việc sử dụng thêm cấu trúc dữ liệu. Ví dụ, hãy tưởng tượng một nước đổ vào bộ xử lý ở giữa việc chèn một nút trong một bộ được sắp xếp. Chà, nếu các bộ xử lý khác cố gắng sau đó để chèn vào tập đã sắp xếp đó, thì chúng sẽ thành công. ( Chỉnh sửa: Theo định nghĩa này, đó là trường hợp nếu cấu trúc dữ liệu sử dụng khóa thì nó không bị khóa, nhưng không phải là trường hợp nếu cấu trúc dữ liệu không sử dụng khóa thì nó không có khóa.)
Với định nghĩa này, tôi nghĩ Herlihy và Boss về cơ bản nói rằng câu trả lời là biến các khu vực quan trọng thành giao dịch.
Nhưng, bạn có thể hỏi, điều này có cùng độ phức tạp không? Tôi không chắc câu hỏi có ý nghĩa. Hãy xem xét push(x) { lock(); stack[size++] = x; unlock(); }
. Đây có phải là một hoạt động thời gian liên tục? Nếu bạn bỏ qua thao tác khóa và do đó người dùng khác thì bạn có thể trả lời CÓ. Nếu bạn không muốn bỏ qua những người dùng khác, thì thực sự không có cách nào để nói liệu đẩy có chạy trong thời gian liên tục hay không. Nếu bạn đi lên một cấp và xem cách ngăn xếp được sử dụng bởi một số thuật toán cụ thể, thì bạn có thể nói rằng việc đẩy sẽ luôn mất thời gian không đổi (bây giờ được tính theo bất cứ điều gì xảy ra là đầu vào của thuật toán song song của bạn). Nhưng đó thực sự là một thuộc tính của thuật toán của bạn, vì vậy không có nghĩa gì khi nói rằng đẩy là một hoạt động thời gian liên tục.
Tóm lại, nếu bạn bỏ qua số lượng người dùng thực hiện một thao tác chờ đợi cho những người dùng khác, thì việc sử dụng các giao dịch thay vì các khu vực quan trọng sẽ trả lời câu hỏi của bạn một cách khẳng định. Nếu bạn không bỏ qua thời gian chờ đợi, thì bạn cần xem cấu trúc dữ liệu được sử dụng như thế nào.