我有3個線程(除了主線程)。線程讀取,處理和寫入。他們每個人都會對一些緩衝區執行此操作,這些緩衝區會循環使用並重新使用。它以這種方式設置的原因是程序可以在其中一個正在運行時繼續執行其他任務。因此,例如,當程序寫入磁盤時,它可以同時讀取更多數據。使用NSConditionLock同步3個線程共享緩衝區。這很難
問題是我需要同步所有這些,以便處理線程不會嘗試處理尚未填充新數據的緩衝區。否則,處理步驟可能會處理其中一個緩衝區中的剩餘數據。
讀取線程將數據讀入緩衝區,然後將緩衝區標記爲數組中的「新數據」。因此,它的工作原理是這樣的:
//set up in main thread
NSConditionLock *readlock = [[NSConditionLock alloc] initWithCondition:0];
//set up lock in thread
[readlock lockWhenCondition:buffer_new[current_buf]];
//copy data to buffer
memcpy(buffer[current_buf],source_data,data_length);
//mark buffer as new (this is reset to 0 once the data is processed)
buffer_new[current_buf] = 1;
//unlock
[readlock unlockWithCondition:0];
我用buffer_new [current_buf]作爲條件變量NSConditionLock。如果緩衝區未被標記爲新的,那麼該線程將被鎖定,等待前一個線程寫入新數據。這部分似乎工作正常。
主要問題是我需要同步這兩個方向。如果由於某種原因讀取線程花費時間過長,並且處理線程已經完成處理所有緩衝區,則處理線程需要等待,反之亦然。
我不確定NSConditionLock是做到這一點的適當方法。
是的。線程很難。 – bbum