2011-12-18 61 views
5

C++ 11 định nghĩa tiêu chuẩn unique_lock::unlock như (§ 30.4.2.2.2, p 1159.)Là unique_lock :: mở khóa chưa được xác định trong tiêu chuẩn C++ 11?

void unlock(); 
Effects: pm->unlock() 
Postcondition: owns == false 
Throws: system_error when an exception is required (30.2.2). 
Error conditions: 
    — operation_not_permitted — if on entry owns is false. 

Tất cả các hoạt động khóa khác xác định rằng một ngoại lệ được ném trên ít nhất hai lần:

  • mutex là NULL (ném system_error với errc::operation_not_permitted)
  • mutex đã được khóa (ném system_error với errc::operation_not_permitted)

Vấn đề với mutex không hợp lệ rõ ràng là có thể đối với unlock cũng vậy, tuy nhiên, tiêu chuẩn chỉ định hành vi của chương trình chỉ cho các vấn đề về khóa. Nó là một lỗi thực sự trong tiêu chuẩn hay tôi thiếu một cái gì đó?

+0

Tôi không chắc chắn tôi sẽ theo dõi. Tại sao nó "rõ ràng là có thể" cho 'mở khóa' được gọi khi mutex không hợp lệ? Bạn có thể suy ra rằng vì hiệu ứng của 'mở khóa()' là 'pm-> mở khóa()', để tránh hành vi không xác định 'pm' không được rỗng và hợp đồng cho' BasicLockable' '* pm' phải được đáp ứng , do đó, khóa phải được sở hữu bởi tác nhân thực thi hiện tại. Có một số tinh tế mà tôi đang thiếu? –

Trả lời

7

Mặc dù không quy định rõ ràng, unique_lock có bất biến sau:

if pm == nullptr then owns == false 
if owns == true then pm != nullptr 

Có chỉ là không có cách nào để có được các unique_lock vào một trạng thái vi phạm những bất biến ngoại trừ thông qua hành vi không xác định. Vì vậy, các khoản:

— operation_not_permitted — if on entry owns is false. 

bao gồm các trường hợp đó pm == nullptr.

Lưu ý rằng ~unique_lock() chỉ cuộc gọi pm->unlock() nếu owns là đúng. Nếu owns là đúng, thì pm != nullptr và do đó unlock() không thể ném.

0

pmmutex_type và định nghĩa cho unlock trong std::mutex là:

void unlock() noexcept; 

Đó là, unlock chức năng không thể ném bất kỳ trường hợp ngoại lệ, do đó unique_lock::unlock không nhất thiết phải kế thừa bất kỳ của những trường hợp ngoại lệ. Về lý do tại sao nó có thể ném bất kỳ ngoại lệ nào cả là một bí ẩn.

Nó là loại khó chịu mà destructor cho unique_lock có thể ném một ngoại lệ (vì tôi đoán nó có thể phải gọi unlock nơi nó cũng có thể). Điều này có vẻ xấu với tôi, kể từ khi sử dụng một đối tượng khóa để mở khóa đúng cách trong xử lý ngoại lệ là một thành ngữ rất phổ biến. Nó thực sự xấu mà khóa có thể ném một ngoại lệ trong quá trình thư giãn chồng - đặc biệt là kể từ khi mutex cơ bản không được phép.

Điều gì đó chắc chắn sai ở đây.

Tôi vẫn đang làm việc kể từ dự thảo công cuối cùng, có lẽ đây đã được cố định

+0

Tôi đang xem xét tiêu chuẩn C++ 11 thực tế. Không có 'unique_ptr :: ~ unique_ptr' là' noexcept', cũng không phải đề xuất ngầm định thêm không cho phép các destructors đã được triển khai, do đó nó chưa được sửa.Tuy nhiên, tôi nghĩ rằng đây là một vấn đề khác. Tiêu chuẩn không xác định những gì xảy ra trong trường hợp, khi 'unique_ptr' không có mutex liên quan và' mở khóa' được gọi trên khóa đó. –

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