Tôi đang sử dụng pthread_mutex_trylock
để khóa mutex trên cấu trúc sao cho chỉ có thể truy cập/sửa đổi một chuỗi duy nhất tại một thời điểm nhất định. Nếu mutex đã bị khóa tôi chỉ trở về từ các thói quen hơn là xếp hàng/chặn.khối `pthread_mutex_trylock` khi được gọi bởi hai luồng cùng một lúc
Đây là một phác thảo cơ bản của mã của tôi:
typedef struct {
pthread_mutex_t m;
} myStruct;
void setupStruct(myStruct* struc) {
pthread_mutex_init(&struc->m, NULL);
}
void structOp(myStruct* struc) {
printf("structOp(): Trying to lock\n");
if(pthread_mutex_trylock(&struc->m) != 0) {
printf("structOp(): Lock failed\n");
return;
} else {
printf("structOp(): Locked\n");
// do some stuff to struct
pthread_mutex_unlock(&struc->m);
}
}
Các struct được khởi tạo một lần như thế này:
myStruct* struc = malloc(sizeof(struc));
setupStruct(struc);
Tuy nhiên, đôi khi hai luồng gọi một thói quen cùng một lúc cả hai cuộc gọi đến trylock
dường như bị chặn. Tôi giả định điều này bởi vì nó in "cố gắng khóa" cho cả hai chủ đề cùng một lúc, nhưng không in có hay không mutex đã bị khóa. Ban đầu, tôi gặp vấn đề này với pthread_mutex_lock
vì vậy đã thử phiên bản không chặn vì lý do này, nhưng dường như nó vẫn bị chặn.
Điều này không phải lúc nào cũng xảy ra nhưng khi nó luôn là trước tiên, hãy gọi số cuộc gọi đến thường lệ. Nếu hai cuộc gọi đầu tiên chạy tốt, thì các cuộc gọi tiếp theo cũng hoạt động tốt.
Có lý do nào để chặn không? Tôi có nhận thấy không chính xác việc chặn này do một số vấn đề khác không? Tôi có thể đăng các phần khác của mã của tôi nếu vấn đề có thể nằm ở nơi khác.
không có lý do cho điều này để ngăn chặn, AFAIK. Có thể có gì đó không ổn ở nơi khác. – Mat
Cuộc gọi setupStruct() nào? Nó không được gọi nhiều hơn một lần, cơ hội nào? –
Nó chắc chắn chỉ được gọi một lần, ngay trước khi các chủ đề mới được bắt đầu. Tôi nghĩ nếu có vấn đề thì rất có thể với việc sử dụng con trỏ của tôi. Những điều này có đúng không? Tôi đang phân bổ cấu trúc với 'myStruct * struc = malloc (sizeof (struc));'. Tôi sẽ cập nhật câu hỏi với thông tin này. – Matt