Tôi có thể đến hơi muộn về việc này.
Việc không có giải pháp (ở câu hỏi đã được hỏi) chủ yếu là do một vấn đề quan trọng trong C ++ (trước C ++ 0x / 11): C ++ có (có) không có mô hình bộ nhớ đồng thời.
Bây giờ, sử dụng std :: atom, bạn có thể kiểm soát các vấn đề về thứ tự bộ nhớ và có các hoạt động so sánh và hoán đổi thích hợp. Tôi đã tự viết bản triển khai hàng đợi không có khóa của Micheal & Scott (PODC96) bằng cách sử dụng C ++ 11 và Con trỏ nguy hiểm của Micheal (IEEE TPDS 2004) để tránh các vấn đề về ABA và miễn phí sớm. Nó hoạt động tốt nhưng nó thực hiện nhanh chóng và bẩn thỉu và tôi không hài lòng với màn trình diễn thực tế. Mã có sẵn trên bitbucket: LockFreeExperiment
Cũng có thể triển khai hàng đợi không có khóa mà không có con trỏ nguy hiểm bằng cách sử dụng các từ kép CAS (nhưng phiên bản 64bit sẽ chỉ khả dụng trên x86-64 sử dụng cmpxchg16b), tôi đã đăng một bài blog về điều đó (với mã chưa được kiểm tra cho hàng đợi) ở đây : Thực hiện so sánh và hoán đổi từ kép chung cho x86 / x86-64 (blog LSE.)
Điểm chuẩn của riêng tôi cho tôi thấy rằng hàng đợi có khóa kép (cũng trong bài báo của Micheal & Scott 1996) hoạt động tốt như hàng không có khóa (tôi chưa đạt đủ ý kiến để cấu trúc dữ liệu bị khóa có vấn đề về hiệu suất, nhưng băng ghế dự bị của tôi quá nhẹ cho bây giờ) và hàng đợi đồng thời từ TBB của Intel dường như thậm chí còn tốt hơn (nhanh hơn hai lần) với một số lượng tương đối nhỏ (tùy thuộc vào hệ điều hành, trong FreeBSD 9, giới hạn thấp nhất mà tôi tìm thấy cho đến nay, con số này là 8 luồng trên một i7 với 4 ht-core, và do đó là 8 CPU logic) của các luồng và có hành vi rất lạ (thời gian thực thi điểm chuẩn đơn giản của tôi chuyển từ giây sang giờ!)
Một hạn chế khác về hàng đợi không khóa theo kiểu STL: việc có trình vòng lặp trên hàng đợi không khóa không có cảm giác.