2011-12-24 35 views
8

khi tôi cố gắng để tạo ra một bản đồ mà có chuỗi như chìa khóa và pthread_mutex_t như yếu tố,lỗi khi sử dụng mutex

map<string, pthread_mutex_t> connectedClientsMutexes; 

    pthread_mutex_t myMutex;//= PTHREAD_MUTEX_INITIALIZER; 
    connectedClientsMutexes.insert(pair<string,pthread_mutex_t>(userName,myMutex)); 
while (1) 
    { 

    pthread_mutex_lock(&connectedClientsMutexes[userName]); 
    // do something here 
    } 

này tạo ra:

phase3: pthread_mutex_lock.c: 312: __pthread_mutex_lock_full: Xác nhận `(- (e))! = 3 || ! mạnh mẽ 'thất bại.

+0

mã đôi khi hoạt động và đôi khi không: S –

Trả lời

8

Không xác định được để sao chép một mutex. Thử đặt con trỏ vào mutex trên bản đồ.

EDIT Đó là bản chất của hành vi không xác định. Đôi khi bạn nhận được may mắn (hoặc dường như) và đôi khi bạn không.

Thay vì sao chép nhiều bản mutex trong bản đồ, thay vào đó bạn đặt nhiều con trỏ vào các mutex. Vì vậy, một cái gì đó như:

map<string, pthread_mutex_t *> connectedClientsMutexes; 

connectedClientsMutexes.insert(pair<string,pthread_mutex_t *>(userName, &myMutex)); 

pthread_mutex_lock(connectedClientsMutexes[userName]); 

Có lẽ bạn đang đi qua bản đồ xung quanh để đề khác nhau nên nó sẽ là khôn ngoan không phải phân bổ những mutexes trên stack trừ khi bạn là tích cực mà họ sẽ không đi ra khỏi phạm vi. Khai báo chúng dưới dạng hình cầu hoặc phân bổ động và khởi tạo chúng với pthread_mutex_init().

+0

Nhưng tôi muốn thêm nhiều hơn một mutex, mã lạ chạy đôi khi và đôi khi không chạy :( –

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