在我的C ++应用程序中,我正在使用pthreads。我有一个主线程,包括工作到另一个线程从磁盘读取和第三个线程写入磁盘。这允许主线程实时执行而不会因读取线程保持在主线程消耗之前并且写入线程与主线程生产保持一致而由于磁盘io而导致打嗝。换句话说,读线程产生数据供主线程处理,写线程消耗主线程产生的数据。
在我的应用程序中,我在主线程和读线程之间共享资源,我在主线程和写线程之间有另一组共享资源。在不需要线程之间的同步期间,主线程自由地访问读写线程的共享资源。然后,当它希望提供要读取或写入的工作时,它会设置共享资源以指示所需的工作,然后释放条件变量以通知读取或写入线程(视情况而定)它应该从中收集请求。共享区域。然后它会阻塞自己,直到请求的线程完成对请求的收集并释放一个单独的条件变量,等待它。这样,处于正常状态的主线程访问共享资源,然后通过在其读或写线程需要访问的时间段内等待条件来阻塞自身,而读写线程与其正常状态相反。不要访问共享资源,只能在主线程已发出信号并等待它们完成访问的同步期间执行此操作。
这是一些非常粗略的伪代码(不要担心这里的确切流程,这只是对功能代码的粗略概念):
MainThread:
do {
While (no pending requests) {
manipulate shared resources;
}
if (need write && ready for read requests) {
setup write request in shared resources;
Release condition startWrite variable;
Wait on condition endWrite variable;
}
if (need read && ready for read requests) {
setup read request in shared resources;
Release condition startRead variable;
Wait on condition endRead variable;
}
}
ReadThread:
do {
Notify I am ready for read requests;
Wait on condition startRead;
copy request out of shared resources;
update shared resources to account for reads completed;
Release condition EndRead;
Perform Read from disk;
}
WriteThread:
do {
Notify I am ready for write requests;
Wait on condition startWrite;
copy request out of shared resources;
update shared resources to account for writes completed;
Release condition EndWrite;
Perform write to disk;
}
我的问题是,这是否只是一种正常的生产者消费者设计模式,还是有一种更具体的普遍接受的设计模式可以描述我所创造的内容?
答案 0 :(得分:2)
您将获得一些后台活动来执行输入和输出,与主线处理无关。可以提前安排读取,以便在需要时数据已经存在,并且可以将写入作为后台活动进行处理,因此主线不必阻止将数据存储到存储中。
这种“设计模式”有一个名称,称为“异步IO”。
答案 1 :(得分:0)
你看过read/write lock pattern了吗?调度程序模式可能是另一个想法,虽然我不确定这在你给定的情况下会有多好。
答案 2 :(得分:0)
您可以将其描述为“主/工作者”模式的实例。 “主”线程将工作(读或写请求)分发给“工作”线程(读线程和写线程)。