Điều này nghe có vẻ giống như vấn đề về kiểu người đọc-người viết-mutex đối với tôi.
[... nhưng tôi chủ yếu làm phát triển nhúng để điều này có thể không có ý nghĩa đối với hệ điều hành Windows. Trên thực tế, trong một hệ điều hành nhúng với một bộ lập lịch dựa trên ưu tiên, bạn có thể thực hiện điều này mà không cần bất kỳ cơ chế đồng bộ nào, nếu bạn đảm bảo rằng hoán đổi là nguyên tử và chỉ cho phép chuỗi ưu tiên thấp hơn trao đổi bộ đệm. ]
Giả sử bạn có hai bộ đệm, B1 và B2, và bạn có hai luồng, T1 và T2. OK nếu T1 đang sử dụng B1 trong khi T2 đang sử dụng B2. Bằng cách "sử dụng" tôi có nghĩa là đọc và/hoặc viết bộ đệm. Sau đó, tại một thời điểm, các bộ đệm cần phải trao đổi để T1 đang sử dụng B2 và T2 đang sử dụng B1. Điều bạn phải cẩn thận là trao đổi được thực hiện trong khi không có luồng nào đang truy cập bộ đệm của nó.
Giả sử bạn chỉ sử dụng một mutex đơn giản. T1 có thể có được mutex và sử dụng B1. Nếu T2 muốn sử dụng B2, nó sẽ phải chờ mutex. Khi T1 hoàn thành, T2 sẽ bỏ chặn và thực hiện công việc của mình với B2. Nếu một trong hai luồng (hoặc một số chủ đề của bên thứ ba) muốn trao đổi các bộ đệm, nó cũng sẽ phải thực hiện mutex. Vì vậy, chỉ sử dụng một mutex serializes truy cập vào bộ đệm - không tốt như vậy.
Nó có thể hoạt động tốt hơn nếu bạn sử dụng mutex của trình đọc giả. T1 có thể thu được khóa đọc trên mutex và sử dụng B1. T2 cũng có thể có được một khóa đọc trên mutex và sử dụng B2. Khi một trong những chủ đề đó (hoặc một chủ đề của bên thứ ba) quyết định đã đến lúc trao đổi bộ đệm, nó sẽ phải ghi một khóa trên mutex. Nó sẽ không thể có được ghi-khóa cho đến khi không có thêm khóa đọc. Tại thời điểm đó, nó có thể trao đổi các con trỏ đệm, biết rằng không ai đang sử dụng một trong hai bộ đệm bởi vì khi có một khóa ghi trên mutex, tất cả các nỗ lực để đọc-khóa sẽ chặn.
Ý của bạn là gì: "Không có chức năng khóa liên động nào thực sự trao đổi giá trị."? Tại sao bạn không thể sử dụng các chức năng này? – AndiDog