****NSConditionLock**** 對(duì)象所定義的互斥鎖可以在使得在某個(gè)條件下進(jìn)行鎖定和解鎖。它和 ****NSCondition**** 很像,但實(shí)現(xiàn)方式是不同的。
當(dāng)兩個(gè)線程需要特定順序執(zhí)行的時(shí)候,例如生產(chǎn)者消費(fèi)者模型,則可以使用 ****NSConditionLock**** 。當(dāng)生產(chǎn)者執(zhí)行執(zhí)行的時(shí)候,消費(fèi)者可以通過特定的條件獲得鎖,當(dāng)生產(chǎn)者完成執(zhí)行的時(shí)候,它將解鎖該鎖,然后把鎖的條件設(shè)置成喚醒消費(fèi)者線程的條件。鎖定和解鎖的調(diào)用可以隨意組合,****lock**** 和 ****unlockWithCondition****: 配合使用 ****lockWhenCondition:**** 和 ****unlock**** 配合使用。
- (void)producer {
while (YES) {
[self.conditionLock lock];
NSLog(@"have something");
self.count++;
[self.conditionLock unlockWithCondition:1];
}
}
- (void)consumer {
while (YES) {
[self.conditionLock lockWhenCondition:1];
NSLog(@"use something");
self.count--;
[self.conditionLock unlockWithCondition:0];
}
}
當(dāng)生產(chǎn)者釋放鎖的時(shí)候,把條件設(shè)置成了1。這樣消費(fèi)者可以獲得該鎖,進(jìn)而執(zhí)行程序,如果消費(fèi)者獲得鎖的條件和生產(chǎn)者釋放鎖時(shí)給定的條件不一致,則消費(fèi)者永遠(yuǎn)無法獲得鎖,也不能執(zhí)行程序。同樣,如果消費(fèi)者釋放鎖給定的條件和生產(chǎn)者獲得鎖給定的條件不一致的話,則生產(chǎn)者也無法獲得鎖,程序也不能執(zhí)行。