2012-06-23 26 views
14

Theo article này:Tại sao khóa std :: mutex hai lần 'Hành vi không xác định'?

Nếu bạn cố gắng và khóa một mutex không đệ quy hai lần từ cùng một sợi mà không cần mở khóa ở giữa, bạn sẽ có được hành vi không xác định.

Tâm trí ngây thơ của tôi cho tôi biết tại sao họ không trả lại lỗi? Có một lý do tại sao điều này đã được UB?

+0

Bạn có thể muốn sử dụng atomic_flag với thứ tự bộ nhớ mặc định. Nó không có cuộc đua dữ liệu và không bao giờ ném ngoại lệ như mutex với nhiều cuộc gọi mở khóa (và hủy bỏ không kiểm soát được, tôi có thể thêm ...). Ngoài ra, có nguyên tử (ví dụ: nguyên tử [bool] hoặc nguyên tử [int] (với dấu ngoặc vuông, chứ không phải [])), có các hàm đẹp như tải và compare_exchange_strong. http://www.cplusplus.com/reference/atomic/atomic_flag/ http://www.cplusplus.com/reference/atomic/atomic/ – Andrew

+0

Cũng như 'mutex' có thể được triển khai với macro gốc của hệ điều hành, sau đó nó làm cho tinh thần để không xác định những gì có thể khác nhau trên hệ điều hành khác nhau để 'std :: mutex' có thể là một wrapper mỏng xung quanh hệ điều hành cung cấp mutex. – Phil1970

Trả lời

26

Bởi vì nó không bao giờ xảy ra trong một chương trình chính xác và kiểm tra thứ gì đó không bao giờ xảy ra là lãng phí (và để kiểm tra nó cần lưu trữ ID luồng riêng, cũng lãng phí).

Lưu ý rằng nó không được xác định cho phép gỡ lỗi triển khai để ném một ngoại lệ, ví dụ, trong khi vẫn cho phép triển khai bản phát hành càng hiệu quả càng tốt.

+1

tốt A, nhưng tbh Tôi nghĩ rằng việc triển khai dbg tốt nên khẳng định, vì ppl đôi khi: P viết mã ăn ngoại lệ mà không gây ra nhiều tiếng ồn. : D – NoSenseEtAl

15

Hành vi chưa xác định cho phép triển khai thực hiện bất cứ điều gì là nhanh nhất/thuận tiện nhất. Ví dụ, việc thực hiện hiệu quả một mutex không đệ quy có thể là một bit duy nhất trong đó hoạt động khóa được thực hiện với một lệnh so sánh và hoán đổi nguyên tử trong một vòng lặp. Nếu thread sở hữu mutex cố gắng khóa nó một lần nữa nó sẽ bế tắc vì nó đang chờ mutex mở khóa nhưng vì không ai khác có thể mở khóa nó (trừ khi có một số lỗi khác mà một số luồng không sở hữu nó mở khóa) thread sẽ chờ mãi mãi.

Các vấn đề liên quan