2013-04-30 71 views
31

Lý do chính để sử dụng nguyên tử trên mutexes, là mutexes đắt tiền nhưng với mô hình bộ nhớ mặc định cho atomicsmemory_order_seq_cst, điều này không đắt như thế?Đồng bộ hóa với `std :: mutex` chậm hơn so với` std :: atomic (memory_order_seq_cst) `?

Câu hỏi: Có thể đồng thời một chương trình sử dụng khóa nhanh bằng chương trình không khóa đồng thời không?

Nếu có, có thể không đáng để thử trừ khi tôi muốn sử dụng memory_order_acq_rel cho nguyên tử.


Edit: tôi có thể bị thiếu một cái gì đó nhưng không thể khóa dựa trên được nhanh hơn lock-free vì mỗi khóa sẽ phải là một rào cản bộ nhớ đầy đủ quá. Nhưng với khóa tự do, có thể sử dụng các kỹ thuật ít rào cản bộ nhớ hơn.

Vì vậy, quay lại câu hỏi của tôi, khóa không còn nhanh hơn khóa dựa trên tiêu chuẩn C++ 11 mới với mặc định memory_model?

Có phải là "không có khóa" = khóa dựa trên khi được đo lường về hiệu suất "true? Giả sử 2 chủ đề phần cứng.


Chỉnh sửa 2: Câu hỏi của tôi không phải là về đảm bảo tiến độ, và có lẽ tôi đang sử dụng "lock-free" ra khỏi ngữ cảnh. Về cơ bản khi bạn có 2 chủ đề với bộ nhớ dùng chung, và sự đảm bảo duy nhất bạn cần là nếu một luồng được viết thì luồng khác không thể đọc hoặc viết, giả định của tôi là một thao tác đơn giản nguyên tử là hoạt động compare_and_swap nhanh hơn khóa một mutex. Bởi vì nếu một sợi không bao giờ chạm vào bộ nhớ dùng chung, bạn sẽ kết thúc khóa và mở khóa liên tục mà không có lý do gì nhưng với các phép toán nguyên tử bạn chỉ sử dụng 1 chu kỳ CPU mỗi lần.

Liên quan đến nhận xét, khóa xoay và khóa mutex rất khác nhau khi có rất ít tranh chấp.

+0

Vâng, có sự bảo đảm tiến độ khác nhau giữa các khóa, mã không có khóa và mã miễn phí. –

+8

[Đọc bắt buộc] (http://www.1024cores.net/home/lock-free-algorithms). –

+1

watch: https://www.youtube.com/watch?v=DCdGlxBbKU4 – NoSenseEtAl

Trả lời

53

Lockfree lập trình là khoảng tiến đảm bảo: Từ mạnh nhất đến yếu nhất, đó là những wait-free, lock-free, cản trở tự do, và chặn.

Đảm bảo là tốn kém và có giá. Càng đảm bảo nhiều hơn, bạn càng trả nhiều tiền hơn. Nói chung, một thuật toán chặn hoặc datastructure (với một mutex, nói) có tự do lớn nhất, và do đó có khả năng nhanh nhất. Thuật toán chờ đợi ở cực đoan khác phải sử dụng các phép toán nguyên tử ở mọi bước, có thể chậm hơn nhiều.

Lấy khóa thực sự khá rẻ, vì vậy bạn không bao giờ nên lo lắng về điều đó mà không có sự hiểu biết sâu sắc về chủ đề. Hơn nữa, việc chặn các thuật toán có mutex là nhiều hơn dễ đọc, viết và lý do hơn. Ngược lại, ngay cả những cấu trúc dữ liệu không khóa đơn giản nhất là kết quả của nghiên cứu tập trung, lâu dài, mỗi nghiên cứu đều có giá trị từ một hoặc nhiều tiến sĩ.

Tóm lại, các thuật toán khóa hoặc chờ đợi giao dịch trễ nhất cho độ trễ và thông lượng trung bình. Mọi thứ chậm hơn, nhưng không có gì là rất chậm.Đây là một đặc tính rất đặc biệt chỉ hữu ích trong các tình huống rất cụ thể (như các hệ thống thời gian thực).

+0

ok - nhưng 2 chủ đề với dữ liệu được chia sẻ .. dont bạn đồng ý rằng một spin-lock nhanh hơn khóa chặn? – jaybny

+0

ví dụ như một ứng dụng giao dịch nghe ve từ 2 sàn trên 2 luồng. sẽ không phải là một spin-lock được nhanh hơn nhiều sau đó mutex? – jaybny

+4

@jaybny: Không, tại sao. Và một spinlock cũng là một khóa. Nó không thay đổi các đảm bảo cơ bản. Và hãy nhìn vào việc thực hiện các mutex pthread cho một bất ngờ thú vị. –

2

Khóa có xu hướng yêu cầu nhiều thao tác hơn thao tác nguyên tử đơn giản. Trong những trường hợp đơn giản nhất, memory_order_seq_cst sẽ nhanh gấp hai lần khóa vì khóa có xu hướng yêu cầu, tối thiểu hai hoạt động nguyên tử trong việc thực hiện của nó (một để khóa, một để mở khóa). Trong nhiều trường hợp, phải mất nhiều hơn thế. Tuy nhiên, một khi bạn bắt đầu tận dụng các đơn đặt hàng bộ nhớ, nó có thể nhanh hơn nhiều bởi vì bạn sẵn sàng chấp nhận đồng bộ hóa ít hơn.

Ngoài ra, bạn sẽ thường thấy "thuật toán khóa luôn nhanh bằng thuật toán khóa miễn phí". Điều này có phần đúng. Ý tưởng cơ bản là nếu thuật toán nhanh nhất xảy ra là khóa tự do, thì thuật toán nhanh nhất mà không có guarentee không có khóa là CSONG cùng một thuật toán! Tuy nhiên, nếu algortihm nhanh nhất yêu cầu khóa, thì những bảo đảm lockfree yêu cầu phải đi tìm một thuật toán chậm hơn.

Nói chung, bạn sẽ thấy thuật toán lockfree trong một vài thuật toán cấp thấp, nơi hiệu suất tận dụng các mã opcodes chuyên dụng sẽ giúp. Trong hầu như tất cả các mã khác, khóa là nhiều hơn hiệu suất thỏa đáng, và dễ dàng hơn nhiều để đọc.

+0

"thuật toán khóa luôn nhanh như thuật toán khóa miễn phí". - Tôi chỉ không hiểu. một vòng lặp thread an toàn với bộ nhớ chia sẻ sẽ nhanh hơn nhiều so với việc thực hiện một phép so sánh đơn giản sau đó một khóa (mutex) unlock (mutex). đặc biệt là nếu không bao giờ tranh chấp từ một sợi khác. – jaybny