2012-04-13 4 views
5

int val = memLoc[index++];Tôi có thể làm cho mã sau khóa miễn phí/nguyên tử không?

hoặc tốt hơn chưa

int val = memLoc[index++ & 0xFF];

Đang cố gắng để làm một thread đọc từ một vòng đệm chia sẻ nơi mỗi cuộc gọi được giá trị tiếp theo - và tôi rất muốn nó được khóa miễn phí nếu ở tất cả có thể vì nó xảy ra một TÔN. Không cho phép Boost/C++ 11: (

+3

Bạn có thể quan tâm đến việc đọc [bài viết này] (http://www.codeproject.com/Articles/43510/Lock-Free-Single-Producer-Single-Consumer-Circular). –

+3

Không C++ 11 có nghĩa là bạn cần một giải pháp chuẩn. Nếu Boost là không thể chấp nhận thì tất cả các thư viện khác (với các điều khoản cấp phép nghiêm ngặt hơn) được cho là tốt, vì vậy bạn không thể lấy bất kỳ thứ gì có thể di chuyển được. Vậy, bạn cần hệ điều hành nào? – MSalters

+0

Loại 'memLoc' là gì? Nó là một con trỏ (hoặc mảng) vào 'int'? –

Trả lời

6

Thao tác duy nhất ở đây cần được đồng bộ hóa là giá trị gia tăng của giá trị index. Vì đây chỉ là giá trị số, nó có thể được thực hiện mà không cần sử dụng khóa thông qua tăng nguyên tử. phần còn lại của các hoạt động bạn được liệt kê là chỉ đọc của một vị trí được chia sẻ và không cần phải được đồng bộ.

On Win32 khiến thặng dư đồng bộ được thực hiện với các chức năng InterlockedIncrement

int oldValue = InterlockedIncrement(&index); 
int val = memLoc[oldValue & 0xFF]; 

có nhiều đồng bộ các hàm gia tăng có sẵn trên Linux. d thảo luận về các tùy chọn trên thread stackoverflow này

+2

Trong C++ 11, có 'std :: atomic_fetch_add' sẽ thực hiện thủ thuật. –

+0

Có bất kỳ kiến ​​trúc nào khi viết một 'int' sẽ không là nguyên tử (nơi bạn sẽ phải đồng bộ hóa phần tử đọc)? –

+0

@MarkB vấn đề không chỉ là viết nguyên tử của phần tử, đó là ghi nguyên tử + đọc giá trị cũ + đảm bảo nó được nhìn thấy trên tất cả các bộ vi xử lý. Thông thường, bạn cần một hướng dẫn đặc biệt cho điều đó. Nhìn vào câu trả lời của tôi, tôi đã lạm dụng nguyên tử ở một vài nơi. Sẽ dọn sạch nó. – JaredPar

1

Bạn sẽ cần phải tăng và đọc lại chỉ mục trong một hoạt động nguyên tử. Thật không may là toán tử ++ không đảm bảo bất kỳ nguyên tử nào.

Hầu hết các bộ xử lý đều có một số loại lệnh tìm nạp-tăng-lưu trữ có thể được sử dụng. Bạn có thể chèn lắp ráp nội tuyến để làm điều đó. http://en.wikipedia.org/wiki/Fetch-and-add

Nếu bạn đang chạy trên Windows, MS cung cấp một API để truy cập này: http://msdn.microsoft.com/en-us/library/windows/desktop/ms684122(v=vs.85).aspx

Nếu bạn đang ở trên một hệ điều hành, có chức năng có khả năng tương tự. Dù thế nào đi chăng nữa, bạn sẽ cần hệ điều hành hoặc truy cập kiểu thấp hơn để có được một cửa hàng nạp-gia tăng nguyên tử.