我有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