Nếu bạn đang nói Cocoa, chức năng mutex được cung cấp bởi NSLock
và NSRecursiveLock
.
Để bảo vệ đúng tài nguyên không nguyên tử, bạn cần những mutexes này, vì sợ nhiều chủ đề có thể cố gắng thay đổi dữ liệu cùng một lúc (dẫn đến tham nhũng) hoặc sử dụng dữ liệu ở trạng thái thay đổi một nửa (dẫn đến dữ liệu không hợp lệ).
Mã của bạn sẽ giống như thế này:
static NSLock session_id_lock;
static unsigned int session_id = 1000;
- (int) generateSessionID{
int new_id;
[myLock lock];
new_id = session_id++;
[myLock unlock];
return new_id;
}
Nếu bạn không sử dụng Cocoa (hoặc những gì ít Cocoa lập trình Tôi nhớ từ Interlude ngắn gọn của tôi với một iMac được rất lờ mờ nhớ ra rằng nó gần vô dụng) , chỉ cần sử dụng khái niệm, dịch nó sang bất kỳ ngôn ngữ hoặc khuôn khổ nào bạn có:
- khóa mutex trước khi sử dụng hoặc thay đổi tài nguyên được bảo vệ.
- sử dụng hoặc thay đổi tài nguyên.
- mở khóa mutex.
- lời khuyên về tiền thưởng 1: khóa mutex càng sớm càng tốt và mở khóa càng sớm càng tốt.
- lời khuyên bổ sung 2: chỉ khóa những gì bạn cần để tránh những sự chậm trễ không cần thiết.
Giải thích rằng điểm cuối cùng một số khác: nếu bạn đồng bộ hóa trên self
cho hai thứ hoàn toàn không liên quan (nói ID phiên và ID người dùng), chúng sẽ chặn nhau mặc dù thực tế là không cần thiết. Tôi muốn hai mutexes riêng biệt để giữ mức độ chi tiết thấp.
Tất nhiên, nếu bạn chỉ có một mutex trên ID phiên (nhưng xem bên dưới để báo trước), hãy sử dụng synchronized(self)
nhưng tôi muốn làm theo cách của mình vì vậy tôi sẽ không bị phát hiện thêm một tài nguyên được bảo vệ khác sau đó.
Trong mọi trường hợp (đây là báo trước được đề cập), có thể bạn sẽ thấy rằng việc đồng bộ hóa trên self
sẽ không bảo vệ đầy đủ biến tĩnh, sẽ được chia sẻ trên nhiều đối tượng. Các mutex nên thuộc về các dữ liệu hơn là bất cứ điều gì đang sử dụng nó.
Bạn cần sử dụng một số loại ngữ nghĩa khóa. Vấn đề là bạn muốn hoạt động là nguyên tử. Nhưng hãy nhớ rằng "++" không phải là nguyên tử chút nào, nó là một vài thao tác cùng một lúc. – BobbyShaftoe
có thể sau đó bao quanh session_id ++ trả về của tôi với (self) {return session_id ++} được đồng bộ hóa. Tuy nhiên tôi không chắc chắn nếu điều này sẽ khóa lớp hoặc đối tượng nó tự. – Unis
như được viết, nó sẽ khóa các trường hợp, không phải là lớp học (không phải những gì bạn muốn). Có lẽ "' @synchronized ([self class]) '"? –