Domanda

lettura che NSTask non è thread-safe e che mi preoccupa molto, perché sto correndo un NSTask all'interno di un NSThread e sta finora non sperimentare alcun problemi di threading con esso.

Il mio codice è organizzato in questo modo

A: main thread -> B: worker thread -> C: worker task

C: The worker task is a commandline program.
B: The worker thread can start/stop the worker task and send it commands.
A: The main thread can send commands to the worker thread.

Se si suppone NSTask essere utilizzato solo all'interno del thread principale, quindi sto pensando di passare avviare il NSTask / codice di stop per il thread principale, proprio per prevenire eventuali problemi di threading.

Can NSTask essere utilizzato al di fuori del thread principale?

E se poi non quello che potrebbe essere i problemi di threading con NSTask?

È stato utile?

Soluzione

  

I letto che NSTask non è thread-safe ...

Non è questo ciò che quella pagina dice. Si dice che si otterrà la notifica processo terminato sullo stesso thread è stato lanciato da, il che suggerisce che NSTask è a conoscenza di discussioni e cerca di fare la cosa giusta.

Il problema uno dei redattori di quella pagina incontrato era che hanno iniziato il loro processo da un filo, poi lasciar morire thread. Che ha causato un incidente, perché il quadro non era più in grado di fornire la notifica di processo terminato al thread corretto.

Il Thread Nota per la sicurezza (segnalibro che) dice qualcosa di simile, elencando NSTask in un elenco delle classi di cui si dice:

  

Nella maggior parte dei casi, è possibile utilizzare queste classi da qualsiasi thread finché non li si usa da un solo thread alla volta. Controllare la documentazione relativa alla classe per ulteriori dettagli.

documentazione

Il NSTask non dice nulla aggiuntive sui thread, così suona come NSTask è uno dei “maggior parte dei casi”: È possibile utilizzare un compito dal thread è stato creato su. Non utilizzare la stessa operazione su un altro thread, e (come detto sopra) assicurarsi che il filo dura almeno fino a quando il processo di attività.

Mi si nota, tuttavia, che nella maggior parte dei casi, non v'è alcuna necessità di eseguire un'operazione su un thread separato. processi separati tendono a correre su altri processori come gli altri thread nel processo fanno, e il ciclo corsa fa un buon lavoro di multiplexing tanti piccoli eventi e mantenendo l'interfaccia utente sensibile. È possibile utilizzare di NSFileHandle metodo readInBackgroundAndNotify se avete bisogno di leggere uscita dal compito. Si può essere in grado di tagliare i vostri thread di lavoro del tutto.

L'alternativa è, come Eimantas suggerito, di utilizzare NSOperation: un intervento che semplicemente inizia un compito particolare e attende che compito di uscita (forse in modo sincrono la lettura in uscita da esso). L'operazione è completa quando il compito è terminato.

Altri suggerimenti

Sì, è possibile, ma vi consiglio di utilizzare NSOperation. E 'KVO-agnostico (a differenza NSTask filettato). Inoltre si consiglia di guardare in design pattern reception per quanto riguarda KVO e l'ambiente filettato (in caso di necessità KVO).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top