У меня 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 являетсяподходящий способ сделать это.