Bloqueando um Objeto de Ser Acessado por Diversos Encadeamentos - Objective-C
Eu tenho uma pergunta sobre segurança de thread em Objective-C. Eu li algumas outras respostas, algumas da documentação da Apple, e ainda tenho algumas dúvidas sobre isso, então pensei em fazer minha própria pergunta.
Minha pergunta étrês vezes:
Suponha que eu tenha uma matrizNSMutableArray *myAwesomeArray;
Dobre 1:
Agora corrija-me se estou enganado, mas pelo que entendi, usando@synchronized(myAwesomeArray){...}
impedirá que dois threads acessem o mesmo bloco de código. Então, basicamente, se eu tiver algo como:
-(void)doSomething {
@synchronized(myAwesomeArray) {
//some read/write operation on myAwesomeArray
}
}
então, se dois threads acessarem omesmo método nomesmo tempo, esse bloco de código será thread-safe. Eu estou supondo que eu entendi esta parte corretamente.
Dobra 2:
O que eu faço semyAwesomeArray
está sendo acessado por vários threads de diferentes métodos? Se eu tenho algo parecido com:
- (void)readFromArrayAccessedByThreadOne {
//thread 1 reads from myAwesomeArray
}
- (void)writeToArrayAccessedByThreadTwo {
//thread 2 writes to myAwesomeArray
}
Agora, ambos os métodos são acessados por dois threads diferentes ao mesmo tempo. Como posso garantir quemyAwesomeArray
não terá problemas? Eu uso algo como NSLock ou NSRecursiveLock?
Dobrar 3:
Agora, nos dois casos acima,myAwesomeArray
Era um iVar na memória. E se eu tiver um arquivo de banco de dados que nem sempre tenho na memória. Eu crio umdatabaseManagerInstance
sempre que eu quiser executar operações de banco de dados e liberá-lo assim que eu terminar. Assim, basicamente, classes diferentes podem acessar o banco de dados. Cada classe cria sua própria instância deDatabaseManger
, mas basicamente, todos eles estão usando o mesmo arquivo de banco de dados único. Como posso garantir que os dados não sejam corrompidos devido a condições de corrida em tal situação?
Isso me ajudará a esclarecer alguns dos meus fundamentos.