Junior
Мутекс (mutex) чист?
sobes.tech AI
Ҷавоб аз AI
موتکس (mutex، قفل متقابل انحصار) یک مکانیزم همزمانی است که برای محافظت از منبع مشترک در برابر دسترسی همزمان از چندین نخ (یا فرآیند) استفاده میشود. در هر لحظه، تنها یک نخ میتواند مالک موتکس باشد و به منبع محافظتشده دسترسی پیدا کند.
عملیات اصلی با موتکس:
- lock (قفل): تلاش برای بهدست آوردن مالکیت موتکس. اگر موتکس آزاد باشد، نخ آن را قفل میکند و ادامه میدهد. اگر قبلاً توسط نخ دیگری گرفته شده باشد، نخ جاری متوقف میشود تا زمانی که موتکس آزاد شود.
- unlock (آزادسازی): آزاد کردن مالکیت موتکس. این اجازه میدهد نخ دیگری که در صف است، آن را بگیرد. مهم است که موتکس توسط همان نخ که آن را گرفته است، آزاد شود.
برای مثال، در Objective-C یا Swift برای کار با موتکسها میتوان از NSLock استفاده کرد.
مثال استفاده از NSLock در Objective-C:
// Objective-C
#import <Foundation/Foundation.h>
@interface MyClass : NSObject {
NSLock *_lock;
int _sharedResource;
}
@end
@implementation MyClass
- (instancetype)init {
self = [super init];
if (self) {
_lock = [[NSLock alloc] init];
_sharedResource = 0;
}
return self;
}
- (void)updateSharedResource {
[_lock lock]; // قفل کردن موتکس
@try {
// کار با _sharedResource - بخش بحرانی
_sharedResource++;
NSLog(@"Shared resource updated to %d by thread %@", _sharedResource, [NSThread currentThread]);
}
@finally {
[_lock unlock]; // آزاد کردن موتکس
}
}
@end
مثال استفاده از NSLock در Swift:
// Swift
import Foundation
class MyClass {
private let lock = NSLock()
private var sharedResource = 0
func updateSharedResource() {
lock.lock() // قفل کردن موتکس
// کار با sharedResource - بخش بحرانی
sharedResource += 1
print("Shared resource updated to \(sharedResource) by thread \(Thread.current)")
lock.unlock() // آزاد کردن موتکس
}
}
موتکسها از وضعیت مسابقه (race condition) جلوگیری میکنند و یکپارچگی دادهها را در دسترسی همزمان تضمین مینمایند. استفاده نادرست از موتکسها میتواند منجر به قفلهای متقابل (deadlocks) شود.