Non è possibile, senza qualche meccanismo di sincronizzazione - per la seconda volta completa la verifica e inizia a leggere il file, FIRST potrebbe aver iniziato a scriverlo di nuovo. Hai bisogno di una sorta di blocco o mutex.
Due opzioni per base Matlab.
Se si trova su un file system locale, è possibile utilizzare un file di blocco separato accanto al file di dati per gestire l'accesso simultaneo al file di dati. Utilizzare gli oggetti NIO FileChannel e FileLock di Java da Matlab per bloccare il primo byte del file di blocco e utilizzarlo come semaforo per controllare l'accesso al file di dati, quindi il lettore attende fino a quando lo scrittore non è terminato e viceversa. (Se questo è su un filesystem di rete, non provarlo - il blocco dei file potrebbe sembrare funzionare ma di solito non è ufficialmente supportato e in base alla mia esperienza non è affidabile.)
Oppure potresti semplicemente provare/aggirare il tuo Chiamare load()
e metterlo in pausa alcuni secondi e riprovare se si ottiene un errore di file corrotto. Il formato di file .mat è tale che non si otterrà una lettura parziale se lo scrittore sta ancora scrivendo; otterrai quell'errore di file corrotto. Quindi potresti usare questo come un tipo pigro di rilevamento e backoff delle collisioni. Questo è quello che faccio di solito.
Per ridurre la finestra di contesa, considerare di scrivere FIRST in un file temporaneo nella stessa directory, quindi utilizzare un nuovo nome per spostarlo nella destinazione finale. In questo modo il file non è disponibile durante un'operazione di spostamento del filesystem veloce, non i 20 secondi di scrittura dei dati. Se si dispone di più scrittori, inserire il PID e il nome host nel nome del file temporaneo per evitare collisioni.
fonte
2012-01-12 18:14:42
Stai utilizzando Parallel Computing Toolbox? –