2011-09-14 40 views
8

Giả sử một chuỗi thành công gọi pthread_mutex_lock, bạn vẫn có thể gọi tới số pthread_mutex_unlock trong cùng một chuỗi đó sẽ không thành công? Nếu vậy, bạn có thể thực sự làm điều gì đó về nó ngoài việc hủy bỏ các chủ đề?Làm cách nào để xử lý các lỗi pthread_mutex_unlock?

if(pthread_mutex_lock(&m) == 0) 
{ 
    // got the lock, let's do some work 

    if(pthread_mutex_unlock(&m) != 0) // can this really fail? 
    { 
     // ok, we have a lock but can't unlock it? 
    } 
} 

Từ this page, lỗi có thể cho pthread_mutex_unlock() là:

[EINVAL] Giá trị theo quy định của mutex không đề cập đến một khởi đối tượng mutex.

Nếu khóa thành công thì điều này có thể không thành công.

[EAGAIN] Mutex có thể không được mua lại bởi vì số lượng tối đa khóa đệ quy cho mutex đã bị vượt quá.

Thật sao? Để mở khóa?

Các pthread_mutex_unlock() chức năng có thể thất bại nếu:

[EPERM] Các chủ đề hiện tại không sở hữu mutex.

Một lần nữa, nếu khóa thành công thì điều này cũng sẽ không xảy ra. Vì vậy, suy nghĩ của tôi là nếu có một khóa thành công thì trong tình huống này mở khóa sẽ không bao giờ thất bại trong việc kiểm tra lỗi và mã xử lý tiếp theo là vô nghĩa.

Trả lời

2

Từ trang người đàn ông cho pthread_mutex_unlock:

The pthread_mutex_unlock() function may fail if: 

EPERM 
The current thread does not own the mutex. 

These functions shall not return an error code of [EINTR]. 

Nếu bạn tin rằng người đàn ông trang, nó sẽ có vẻ rằng trường hợp lỗi của bạn không thể xảy ra.

+0

Cảm ơn, đó cũng là suy nghĩ của tôi. Tôi đã cập nhật câu hỏi để hy vọng làm rõ hơn tại sao tôi hỏi. Tôi muốn giữ để xem liệu tôi có thể nhận được bất kỳ đầu vào nào khác trước khi tôi chấp nhận câu trả lời hay không. –

2

Trước khi bạn khóc "chiến thắng". Tôi đã kết thúc trên trang này tìm kiếm lý do tại sao một trong các chương trình của tôi không thành công trên pthread_mutex_unlock (trên HP-UX, không phải Linux).

if (pthread_mutex_unlock(&mutex) != 0) 
    throw YpException("unlock %s failed: %s", what.c_str(), strerror(errno)); 

Điều này không thành công đối với tôi, sau nhiều triệu lần thực hiện hạnh phúc. errno là EINTR, mặc dù tôi vừa phát hiện ra rằng tôi không nên kiểm tra errno, mà là giá trị trả về. Tuy nhiên, giá trị trả về là KHÔNG 0. Và tôi có thể chứng minh toán học rằng tại chỗ đó tôi sở hữu một khóa hợp lệ.

Vì vậy, hãy chỉ nói lý thuyết của bạn đang bị căng thẳng, mặc dù cần có nhiều nghiên cứu hơn ;-)

+0

Tuyệt vời! hoặc có lẽ không tuyệt vời. :-) Đây chính xác là loại phản hồi tôi đang tìm kiếm. Bạn có thể tạo lại lỗi này hay là một thứ một lần? Sẽ rất thú vị khi biết giá trị trả về thực tế là gì bởi vì 'pthread_mutex_unlock()' không phải trả về 'EINTR', trong' errno' hoặc ngược lại. –

+0

Tôi đã không thể tái tạo nó.Tôi đã sửa lỗi ghi nhật ký của mình để hiển thị giá trị trả lại thực tế thay vì errno. Tiếp theo thời gian nó xảy ra (tôi hy vọng không) Tôi sẽ cho bạn biết chính xác nó là gì ;-) – geert3

+2

Ít cập nhật: tôi đã có sự xuất hiện giả mạo của mở khóa không thành công, trả về giá trị == 1, có nghĩa là "Không phải chủ sở hữu". Điều này hóa ra lại là một lỗi rất tinh tế. Tôi bọc tất cả các khóa của tôi trong các đối tượng (phá hủy mở khóa). Điều này rất tiện dụng vì khóa tự động kết thúc cùng với phạm vi của đối tượng. Trong chức năng này, tôi đang gọi thread_exit(). Trang Man cho biết bạn không thể sử dụng các biến tự động sau thread_exit(). Đó là chính xác những gì phá hủy đối tượng khóa gói của tôi đã làm (ngầm gọi là SAU thread_exit). – geert3

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