缓冲区并发访问方法及装置的制造方法
【技术领域】
[0001]本发明涉及数据处理领域,特别涉及一种缓冲区并发访问方法及装置。
【背景技术】
[0002]支持并发访问的缓冲区一般以特定数据结构+全局锁来实现;其中,所谓并发访问为多个线程在不同的时刻均能够访问该缓冲区,而缓冲区在某个时刻仅仅允许一个线程访问;而所谓数据结构可以例如:同步队列,哈希表、同步链表等。
[0003]现有技术中,以同步队列为例,如果写线程被CPU唤醒而访问缓冲区时,需要调用相应的条件变量(即写条件变量)以获得全局锁,在写入数据之前首先在队尾新建一个内容为空的节点,而为了保证队列的有效性,其他节点也将被调整;而如果读线程被CPU唤醒而访问缓冲区时,需要调用相应的条件变量(即读条件变量)以获得全局锁,在读取队头的节点中的数据之后,会删除该节点,而为了保证队列的有效性,其他节点也将被调整。
[0004]可见,现有技术中写线程/读线程被CPU唤醒后访问缓冲区时均涉及到缓冲区的数据结构的改变,而改变缓冲区的数据结构会较为耗时,这无疑会导致缓冲区的访问效率较低。
【发明内容】
[0005]基于上述问题,本发明实施例公开了一种缓冲区并发访问方法及装置,以提高缓冲区的访问效率。技术方案如下:
[0006]第一方面,本发明实施例提供了一种缓冲区并发访问方法,应用于缓冲区并发访问架构中被CPU唤醒的写线程/读线程;所述缓冲区并发访问架构包括:N个线程访问组,其中,每个线程访问组对应各自的缓冲区子区域,并且,每个线程访问组均包括:一个读线程和一个写线程,所述读线程和所述写线程分别对应有各自的用于获得所述缓冲区的全局锁的条件变量;并且,所述N个线程访问组内的当前被唤醒的写线程/读线程之外的写线程所对应的条件变量和读线程所对应的条件变量均处于阻塞状态;所述方法包括:
[0007]调用被CPU解除阻塞的条件变量以获得所述缓冲区的全局锁;
[0008]对所述被CPU唤醒的写线程/读线程所对应的缓冲区子区域执行访问操作;
[0009]在访问操作执行完毕后,释放所调用的所述条件变量,以使得所述CPU在获知当前被唤醒的写线程/读线程释放所述条件变量后,能够解除执行下一次访问操作所需的写线程/读线程所对应的条件变量的阻塞。
[0010]可选的,当写线程被CPU唤醒时,所述对所述被CPU唤醒的写线程/读线程所对应的缓冲区子区域执行访问操作,包括:
[0011]对被CPU唤醒的写线程所对应的缓冲区子区域执行数据写入操作;
[0012]当读线程被CPU唤醒时,所述对所述被CPU唤醒的写线程/读线程所对应的缓冲区子区域执行访问操作,包括:
[0013]对被CPU唤醒的读线程所对应的缓冲区子区域执行数据读取操作。
[0014]可选的,所述对所述被CPU唤醒的写线程/读线程所对应的缓冲区子区域执行访问操作之前,还包括:
[0015]判断所述被CPU唤醒的写线程/读线程所对应的缓冲区子区域是否处于所需的访问状态,如果是,对所述被CPU唤醒的写线程/读线程所对应的缓冲区子区域执行访问操作;
[0016]在访问操作执行完毕后,所述方法还包括:
[0017]将所述被CPU唤醒的写线程/读线程所对应的缓冲区子区域设置为与访问操作对应的访问状态。
[0018]可选的,当写线程被CPU唤醒时:
[0019]所述判断所述被CPU唤醒的写线程/读线程所对应的缓冲区子区域是否处于所需的访问状态,包括:
[0020]判断所述被CPU唤醒的写线程所对应的缓冲区子区域是否处于数据未写入状态;
[0021]所述将所述被CPU唤醒的写线程/读线程所对应的缓冲区子区域设置为与访问操作对应的访问状态,包括:
[0022]将所述被CPU唤醒的写线程所对应的缓冲区子区域设置为数据已写入状态;
[0023]当读线程被CPU唤醒时:
[0024]所述判断所述被CPU唤醒的写线程/读线程所对应的缓冲区子区域是否处于所需的访问状态,包括:
[0025]判断所述被CPU唤醒的读线程所对应的缓冲区子区域是否处于数据已写入状态;
[0026]所述将所述被CPU唤醒的写线程/读线程所对应的缓冲区子区域设置为与访问操作对应的访问状态,包括:
[0027]将所述被CPU唤醒的读线程所对应的缓冲区子区域设置为数据未写入状态。
[0028]第二方面,本发明实施例还提供了一种缓冲区并发访问装置,应用于缓冲区并发访问架构中被唤醒的写线程/读线程;所述缓冲区并发访问架构包括:N个线程访问组,其中,每个线程访问组对应各自的缓冲区子区域,并且,每个线程访问组均包括:一个读线程和一个写线程,所述读线程和所述写线程分别对应有各自的用于获得所述缓冲区的全局锁的条件变量;并且,所述N个线程访问组内的当前被唤醒的写线程/读线程之外的写线程所对应的条件变量和读线程所对应的条件变量均处于阻塞状态;所述装置包括:
[0029]条件变量调用模块,用于调用被CPU解除阻塞的条件变量以获得所述缓冲区的全局锁;
[0030]访问操作执行模块,用于对所述被CPU唤醒的写线程/读线程所对应的缓冲区子区域执行访问操作;
[0031]条件变量释放模块,用于在访问操作执行完毕后,释放所调用的所述条件变量,以使得所述CPU在获知当前被唤醒的写线程/读线程释放所述条件变量后,能够解除执行下一次访问所需的写线程/读线程所对应的条件变量的阻塞。
[0032]可选的,所述访问操作执行模块,包括:
[0033]数据写入操作执行单元,用于当写线程被CPU唤醒时,对所述被CPU唤醒的写线程所对应的缓冲区子区域执行数据写入操作;
[0034]数据读取操作执行单元,用于当读线程被CPU唤醒时,对所述被CPU唤醒的读线程所对应的缓冲区子区域执行数据读取操作。
[0035]可选的,本发明实施例所提供的一种缓冲区并发访问装置还包括:
[0036]访问状态判断模块,用于在所述访问操作执行模块对所述被CPU唤醒的写线程/读线程所对应的缓冲区子区域执行访问操作之前,判断所述被CPU唤醒的写线程/读线程所对应的缓冲区子区域是否处于所需的访问状态,如果是,触发所述访问操作执行模块;
[0037]访问状态设置模块,用于在访问操作执行完毕后,将所述被CPU唤醒的写线程/读线程所对应的缓冲区子区域设置为与访问操作对应的访问状态。
[0038]可选的,所述访问状态判断模块,包括:
[0039]第一访问状态判断单元,用于当写线程被CPU唤醒时,在访问操作执行模块对所述被CPU唤醒的写线程所对应的缓冲区子区域执行访问操作之前,判断所述被CPU唤醒的写线程所对应的缓冲区子区域是否处于数据未写入状态,如果是,触发所述访问操作执行丰吴块;
[0040]第二访问状态判断单元,用于当读线程被CPU唤醒时,在访问操作执行模块对所述被CPU唤醒的读线程所对应的缓冲区子区域执行访问操作之前,判断所述被CPU唤醒的读线程所对应的缓冲区子区域是否处于数据已写入状态,如果是,触发所述访问操作执行模块;
[0041 ] 所述访问状态设置模块,包括:
[0042]第一访问状态设置单元,用于当写线程被CPU唤醒时,在访问操作执行完毕后,将所述被CPU唤醒的写线程所对应的缓冲区子区域设置为数据已写入状态;
[0043]第二访问状态设置单元,用于当读线程被CPU唤醒时,在访问操作执行完毕后,将所述被CPU唤醒的读线程所对应的缓冲区子区域设置为数据未写入状态。
[0044]本发明实施例中,缓冲区并发访问架构包括:N个线程访问组,其中,每个线程访问组对应各自的缓冲区子区域,并且,每个线程访问组均包括:一个读线程和一个写线程,读线程和写线程分别对应有各自的用于获得缓冲区子区域所在缓冲区的全局锁的条件变量;而当任意一线程访问组内的写线程/读线程被CPU唤醒后,调用被CPU解除阻塞的相应的条件变量以获得该缓冲区的全局锁;对该被唤醒的写线程/读线程所对应的缓冲区子区域执行相应的访问操作;在访问操作执行完毕后,释放所调用的相应的条件变量,以使得CPU在获知当前被唤醒的写线程/读线程释放相应的条件变量后,能够解除执行下一次访问操作所需的写线程/读线程所对应的条件变量的阻塞。可见,通过利用本方案,每个线程访
问组对应各自固有的缓冲区子区域,即线程对缓冲区的访问为基于位置的访问,而不再基于特定的数据结构,这样使得在访问缓冲区过程中,避免了缓冲区的数据结构的修改,因此,能够提高缓冲区访问效率。
【附图说明】
[0045]为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
[0046]图1为本发明实施例所提供的一种缓冲区并发访问方法的第一种流程图;
[0047]图2为本发明实施例所提供的一种缓冲区并发访问方法的第二种流程图;
[0048]图3为本发明实施例所提供的缓冲区并发访问架构的示意图;
[0049]图4为本发明实施例所提供的一种缓冲区并发访问装置的结构示意图。
【具体实施方式】
[0050]下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
[0051]为了提高缓冲区访问效率,本发明实施例提供了一种缓冲区并发访问方法及装置。
[0052]下面首先对本发明实施例所提供的一种缓冲区并发访问方法进行介绍。
[0053]需要说明的是,本发明实施例所提供的一种缓冲区并发访问方法应用于缓冲区并发访问架构中被唤醒的写线程/读线程;该缓冲区并发访问架构包括N个线程访问组,其中,每个线程访问组对应各自的缓冲区子区域,并且,每个线程访问组均包括:一个读线程和一个写线程,该读线程和该写线程分别对应有各自的用于获得所在缓冲区的全局锁的条件变量;并且,该N个线程访问组内的当前被唤醒的写线程/读线程之外的写线程所对应的条件变量和读线程所对应的条件变量均处于阻塞状态。其中,需要说明的是,当一个线程所对应的条件变量被CPU解除阻塞后,该线程被CPU唤醒。
[0054]为了清楚起见,本发明实施例所述的缓冲区并发访问架构可以参照图3。其中,如图3所示,每个线程访问组对应各自的缓冲区子区域具体为:线程访问组O对应有缓冲区子区域0,线程访问组I对应有缓冲区子区域1,以此类推,线程访问组(N-1)对应有缓冲区子区域(N-1);如图3所示,每个线程访问组均包括:一个读线程和一个写线程,具体为:线程访问组O包括有读线程O和写线程0,线程访问组I包括读线程I和写线程1,以此类推,线程访冋组(N-1)包括读线程(N-1)和写线程(N-1)。
[0055]可以理解的是,基于上述的缓冲区并发访问架构,在执行缓冲区并发访问之前,(PU首先指定所允许的并发访问数量N,并定义具有N个缓冲区子区域的缓冲区,即确定N个缓冲区子区域作为支持并发访问的缓冲区;然后定义N个线程访问组,其中,每个线程访问组对应各自的缓冲区子区域,并且每一个线程访问组包括一个读线程和一个写线程,且读线程和写线程分别对应各自的用于获得缓冲区的全局锁的条件变量,具体的,读线程对应的条件变量可以被命名为读条件变量,而写线程对应的条件变量可以被命名为写条件变量。
[0056]参见图1,本发明实施例所提供的一种缓冲区并发访问方法,包括如下步骤:
[0057]S101,调用被CPU解除阻塞的条件变量以获得该缓冲区的全局锁;
[0058]其中,CPU可以根据自身的数据处理机制,唤醒所需的任意一个线程访问组内的写线程/读线程,进而使得被唤醒的写线程/读线程能够对相应的缓冲区子区域进行访问操作。
[0059]相应的,任意一线程访问组内的写线程/读线程被CPU唤醒后,调用被CPU解除阻塞的条件变量以获得该缓冲区的全局锁;而在被唤醒的写线程/读线程获得全局锁后,能够对缓冲区进行独享,即其他写线程或读线程均无法访问缓冲区。
[0060]需要强调的是,为了保证多个线程对缓冲区的并发访问,N个线程访问组内的当前被唤醒的写线程/读线程之外的写线程所对应的条件变量和读线程所对应的条件变量均处于阻塞状态,以保证多个线程对缓存区的并发访问;相应的,N个线程访问组内的当前被唤醒的写线程/读线程之外的写线程和读线程均无法调用自身所对应的条件变量,因此,当前被唤醒的写线程/读线程之外的写线程和读线程均被阻塞。
[0061]S102,对所述被CPU唤醒的写线程/读线程所对应的缓冲区子区域执行访问操作;
[0062]由于预先已经为每个线程访问组分配各自的缓冲区子区域,因此,被唤醒的写线程/读线程可以直接对其自身所对应的缓冲区子区域执行访问操作。
[0063]需要说明的是,当写线程被CPU唤醒时,对所述被CPU唤醒的写线程/读线程所对应的缓冲区子区域执行访问操作,可以包括:
[0064]对所述被CPU唤醒的写线程所对应的缓冲区子区域执行数据写入操作;
[0065]当读线程被CPU唤醒时,对所述被CPU唤醒的写线程/读线程自身所对应的缓冲区子区域执行访问操作,可以包括:
[0066]对所述被CPU唤醒的读线程所对应的缓冲区子区域执行数据读取操作。
[0067]需要说明的是,关于线程访问组内的写线程对其自身对应的缓冲区子区域执行数据写入操作的具体实现过程可以与现有技术相同,在此不做赘述;同样的,关于线程访问组内的读线程对其自身所对应的缓冲区子区域执行数据读取操作的具体实现过程可以与现有技术相同,在此不做赘述。
[0068]S103,在访问操作执行完毕后,释放所调用该条件变量,以使得CPU在获知当前被唤醒的写线程/读线程释放该条件变量后,能够解除执行下一次访问操作所需的写线程/读线程所对应的条件变量的阻塞。
[0069]具体的,如果写线程被CPU唤醒,该写线程对其所对应的缓冲区子区域执行数据写入操作后,可以释放所调用该条件变量,即写条件变量;而如果读线程被CPU唤醒,该读线程对其所对应的缓冲区子区域执行数据读取操作后,可以释放所调用的该条件变量即读条件变量。
[0070]并且,CPU在获知当前被唤醒的写线程/读线程释放该条件变量后,能够解除执行下一次访问操作所需的写线程/读线程所对应的条件变量的阻塞,而被解除阻塞的条件变量能够被执行下一次访问操作所需的写线程/读线程所调用。
[0071]需要强调的是,当执行下一次访问操作所需的写线程/读线程为本次被唤醒的线程且立即执行下一次访问操作时,本次所释放的相应的条件变量可以不被阻塞,从而使得本次所需的写线程/读线程仍处于唤醒状态;否则,本次所释放的该条件变量将被阻塞。
[0072]本发明实施例中,缓冲区并发访问架构包括:N个线程访问组,其中,每个线程访问组对应各自的缓冲区子区域,并且,每个线程访问组均包括:一个读线程和一个写线程,读线程和写线程分别对应有各自的用于获得缓冲区子区域所在缓冲区的全局锁的条件变量;而当任意一线程访问组内的写线程/读线程被CPU唤醒后,调用被CPU解除阻塞的相应的条件变量以获得该缓冲区的全局锁;对该被唤醒的写线程/读线程所对应的缓冲区子区域执行相应的访问操作;在访问操作执行完毕后,释放所调用的相应的条件变量,以使得CPU在获知当前被唤醒的写线程/读线程释放相应的条件变量后,能够解除执行下一次访问操作所需的写线程/读线程所对应的条件变量的阻塞。可见,通过利用本方案,每个线程访问组对应各自固有的缓冲区子区域,即线程对缓冲区的访问为基于位置的访问,而不再基于特定的数据结构,这样使得在访问缓冲区过程中,避免了缓冲区的数据结构的修改,因此,能够提高缓冲区访问效率。
[0073]参见图2,本发明实施例所提供的一种缓冲区并发访问方法,包括如下步骤:
[0074]S201,调用被CPU解除阻塞的条件变量以获得该缓冲区的全局锁;
[0075]其中,CPU可以根据自身的数据处理机制,唤醒所需的任意一个线程访问组内的写线程/读线程,进而使得被唤醒的写线程/读线程能够对相应的缓冲区子区域进行访问操作。
[0076]相应的,任意一线程访问组内的写线程/读线程被CPU唤醒后,调用被CPU解除阻塞的条件变量以获得该缓冲区的全局锁;而在被唤醒的写线程/读线程获得全局锁后,能够对缓冲区进行独享,即其他写线程或读线程均无法访问缓冲区。
[0077]需要
强调的是,为了保证多个线程对缓冲区的并发访问,N个线程访问组内的当前被唤醒的写线程/读线程之外的写线程所对应的条件变量和读线程所对应的条件变量均处于阻塞状态,以保证多个线程对缓存区的并发访问;相应的,N个线程访问组内的当前被唤醒的写线程/读线程之外的写线程和读线程均无法调用自身所对应的条件变量,因此,当前被唤醒的写线程/读线程之外的写线程和读线程均被阻塞。
[0078]S202,判断所述被CPU唤醒的写线程/读线程所对应的缓冲区子区域是否处于所需的访冋状态;
[0079]由于预先已经为每个线程访问组分配各自的缓冲区子区域,因此,被唤醒的写线程/读线程可以判断所述被CPU唤醒的写线程/读线程所对应的缓冲区子区域是否处于所需的访问状态,进而根据不同的判断结果执行不同的操作。具体的,在判断出所述被CPU唤醒的写线程/读线程所对应的缓冲区子区域处于所需的访问状态时,可以执行S203;否则,释放该条件变量,从而使得该条件变量将被阻塞,此时,被唤醒的写线程/读线程无法继续执行,直到其对应的缓冲子区域的访问状态被更改。
[0080]具体的,如果写线程被CPU唤醒时,所述判断所述被CPU唤醒的写线程/读线程所对应的缓冲区子区域是否处于所需的访问状态可以包括:判断所述被CPU唤醒的写线程所对应的缓冲区子区域是否处于数据未写入状态;如果读线程被CPU唤醒时,判断所述被CPU唤醒的写线程/读线程所对应的缓冲区子区域是否处于所需的访问状态可以包括:判断所述被CPU唤醒的读线程所对应的缓冲区子区域是否处于数据已写入状态。
[0081]需要强调的是,当写线程被唤醒时,如果其对应的缓冲区子区域的访问状态为数据已写入状态,该写线程对应的条件变量被阻塞,该写线程无法继续执行,直到有读线程从该缓冲区子区域读取数据,并将该缓冲区子区域设置为数据未写入状态;同理,当读线程被唤醒后,如果其对应的缓冲区子区域的访问状态为数据未写入状态,该读线程对应的条件变量被阻塞,该读线程无法继续执行,直到有写线程从该缓冲区子区域写入数据,并将该缓冲区子区域设置为数据已写入状态。
[0082]可以理解的是,不同的访问状态可以通过不同的标识进行表征,当然并不局限与此。
[0083]S203,当判断出所述被CPU唤醒的写线程/读线程所对应的缓冲区子区域处于所需的访问状态时,对所述被CPU唤醒的写线程/读线程所对应的缓冲区子区域执行访问操作;
[0084]由于预先已经为每个线程访问组分配各自的缓冲区子区域,因此,被唤醒的写线程/读线程当判断出所述被CPU唤醒的写线程/读线程所对应的缓冲区子区域处于所需的访问状态时,可以直接对其自身所对应的缓冲区子区域执行访问操作。
[0085]需要说明的是,当写线程被CPU唤醒时,对所述被CPU唤醒的写线程/读线程所对应的缓冲区子区域执行访问操作,可以包括:
[0086]对所述被CPU唤醒的写线程所对应的缓冲区子区域执行数据写入操作;
[0087]当读线程被CPU唤醒时,对所述被CPU唤醒的写线程/读线程自身所对应的缓冲区子区域执行访问操作,可以包括:
[0088]对所述被CPU唤醒的读线程所对应的缓冲区子区域执行数据读取操作。
[0089]需要说明的是,关于线程访问组内的写线程对其自身对应的缓冲区子区域执行数据写入操作的具体实现过程可以与现有技术相同,在此不做赘述;同样的,关于线程访问组内的读线程对其自身所对应的缓冲区子区域执行数据读取操作的具体实现过程可以与现有技术相同,在此不做赘述。
[0090]S204,在访问操作执行完毕后,释放所调用的该条件变量,以使得CPU在获知当前被唤醒的写线程/读线程释放该条件变量后,能够解除执行下一次访问操作所需的写线程/读线程所对应的条件变量的阻塞。
[0091]具体的,如果写线程被CPU唤醒,该写线程对其所对应的缓冲区子区域执行数据写入操作后,可以释放所调用的该条件变量,即写条件变量;而如果读线程被CPU唤醒,该读线程对其所对应的缓冲区子区域执行数据读取操作后,可以释放所调用的该条件变量,即读条件变量。
[0092]并且,CPU在获知当前被唤醒的写线程/读线程释放该条件变量后,能够解除执行下一次访问操作所需的写线程/读线程所对应的条件变量的阻塞,而被解除阻塞的条件变量能够被执行下一次访问操作所需的写线程/读线程所调用。
[0093]需要强调的是,当执行下一次访问操作所需的写线程/读线程为本次被唤醒的线程且立即执行下一次访问操作时,本次所释放的相应的条件变量可以不被阻塞,从而使得本次所需的写线程/读线程仍处于唤醒状态;否则,本次所释放的该条件变量将被阻塞。
[0094]可见,通过利用本方案,每个线程访问组对应各自固有的缓冲区子区域,即线程对缓冲区的访问为基于位置的访问,而不再基于特定的数据结构,这样使得在访问缓冲区过程中,避免了缓冲区的数据结构的修改,因此,能够提高缓冲区访问效率。并且,当判断出所述被CPU唤醒的写线程/读线程所对应的缓冲区子区域处于所需的访问状态时,才对所述被CPU唤醒的写线程/读线程所对应的缓冲区子区域执行访问操作,因此,通过利用本方案,能够进一步提高缓冲区的访问有效性。
[0095]相应于上述方法实施例,本发明实施例还提供了一种缓冲区并发访问装置,该缓冲区并发访问装置应用于缓冲区并发访问架构中被唤醒的写线程/读线程;所述缓冲区并发访问架构包括:N个线程访问组,其中,每个线程访问组对应各自的缓冲区子区域,并且,每个线程访问组均包括:一个读线程和一个写线程,所述读线程和所述写线程分别对应有各自的用于获得所述缓冲区的全局锁的条件变量;并且,所述N个线程访问组内的当前被唤醒的写线程/读线程之外的写线程所对应的条件变量和读线程所对应的条件变量均处于阻塞状态;如图4所示,所述装置可以包括:
[0096]条件变量调用模块410,用于调用被CPU解除阻塞的条件变量以获得所述缓冲区的全局锁;
[0097]访问操作执行模块420,用于对所述被CPU唤醒的写线程/读线程所对应的缓冲区子区域执行访问操作;
[0098]条件变量释放模块430,用于在访问操作执行完毕后,释放所调用的条件变量,以使得所述CPU在获知当前被唤醒的写线程/读线程释放所述条件变量后,能够解除执行下一次访问所需的写线程/读线程所对应的条件变量的阻塞。
[0099]可见,通过利用本方案,每个线程访问组对应各自固有的缓冲区子区域,即线程对缓冲区的访问为基于位置的访问,而不再基于特定的数据结构,这样使得在访问缓冲区过程中,避免了缓冲区的数据结构的修改,因此,能够提高缓冲区访问效率。
[0100]具体的,所述访问操作执行模块420,可以包括:
[0101]数据写入操作执行单元,用于当写线程被CPU唤醒时,对所述被CPU唤醒的写线程所对应的缓冲区子区域执行数据写入操作;
[0102]数据读取操作执行单元,用于当读线程被CPU唤醒时,对所述被CPU唤醒的读线程所对应的缓冲区子区域执行数据读取操作。
[0103]更进一步的,在上述的包括条件变量调用模块410、访问操作执行模块420和条件变量释放模块430的缓冲区并发访问装置的基础上,本发明另一实施例所提供的一种缓冲区并发访问装置还可以包括:
[0104]访问状态判断模块,用于在所述访问操作执行模块对所述被CPU唤醒的写线程/读线程所对应的缓冲区子区域执行访问操作之前,判断所述被CPU唤醒的写线程/读线程所对应的缓冲区子区域是否处于所需的访问状态,如果是,触发所述访问操作执行模块;
[0105]访问状态设置模块,用于在访问操作执行完毕后,将所述被CPU唤醒的写线程/读线程所对应的缓冲区子区域设置为与访问操作对应的访问状态。
[0106]具体的,所述访问状态判断模块,可以包括:
[0107]第一访问状态判断单元,用于当写线程被CPU唤醒时,在访问操作执行模块对所述被CPU唤醒的写线程所对应的缓冲区子区域执行访问操作之前,判断所述被CPU唤醒的写线程所对应的缓冲区子区域是否处于数据未写入状态,如果是,触发所述访问操作执行丰吴块;
[0108]第二访问状态判断单元,用于当读线程被CPU唤醒时,在访问操作执行模块对所述被CPU唤醒的读线程所对应的缓冲区子区域执行访问操作之前,判断所述被CPU唤醒的读线程所对应的缓冲区子区域是否处于数据已写入状态,如果是,触发所述访问操作执行丰吴块;<
br>[0109]所述访问状态设置模块,可以包括:
[0110]第一访问状态设置单元,用于当写线程被CPU唤醒时,在访问操作执行完毕后,将所述被CPU唤醒的写线程所对应的缓冲区子区域设置为数据已写入状态;
[0111]第二访问状态设置单元,用于当读线程被CPU唤醒时,在访问操作执行完毕后,将所述被CPU唤醒的读线程所对应的缓冲区子区域设置为数据未写入状态。
[0112]对于系统或装置实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
[0113]需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
[0114]本领域普通技术人员可以理解实现上述方法实施方式中的全部或部分步骤是可以通过程序来指令相关的硬件来完成,所述的程序可以存储于计算机可读取存储介质中,这里所称得的存储介质,如:ROM/RAM、磁碟、光盘等。
[0115]以上所述仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围。凡在本发明的精神和原则之内所作的任何修改、等同替换、改进等,均包含在本发明的保护范围内。
【主权项】
1.一种缓冲区并发访问方法,其特征在于,应用于缓冲区并发访问架构中被CPU唤醒的写线程/读线程;所述缓冲区并发访问架构包括:N个线程访问组,其中,每个线程访问组对应各自的缓冲区子区域,并且,每个线程访问组均包括:一个读线程和一个写线程,所述读线程和所述写线程分别对应有各自的用于获得所述缓冲区的全局锁的条件变量;并且,所述N个线程访问组内的当前被唤醒的写线程/读线程之外的写线程所对应的条件变量和读线程所对应的条件变量均处于阻塞状态;所述方法包括: 调用被CPU解除阻塞的条件变量以获得所述缓冲区的全局锁; 对所述被CPU唤醒的写线程/读线程所对应的缓冲区子区域执行访问操作; 在访问操作执行完毕后,释放所调用的所述条件变量,以使得所述CPU在获知当前被唤醒的写线程/读线程释放所述条件变量后,能够解除执行下一次访问操作所需的写线程/读线程所对应的条件变量的阻塞。2.根据权利要求1所述的方法,其特征在于,当写线程被CPU唤醒时,所述对所述被CPU唤醒的写线程/读线程所对应的缓冲区子区域执行访问操作,包括: 对被CPU唤醒的写线程所对应的缓冲区子区域执行数据写入操作; 当读线程被CPU唤醒时,所述对所述被CPU唤醒的写线程/读线程所对应的缓冲区子区域执行访问操作,包括: 对被CPU唤醒的读线程所对应的缓冲区子区域执行数据读取操作。3.根据权利要求1所述的方法,其特征在于,所述对所述被CPU唤醒的写线程/读线程所对应的缓冲区子区域执行访问操作之前,还包括: 判断所述被CPU唤醒的写线程/读线程所对应的缓冲区子区域是否处于所需的访问状态,如果是,对所述被CPU唤醒的写线程/读线程所对应的缓冲区子区域执行访问操作;在访问操作执行完毕后,所述方法还包括: 将所述被CPU唤醒的写线程/读线程所对应的缓冲区子区域设置为与访问操作对应的访问状态。4.根据权利要求3所述的方法,其特征在于,当写线程被CPU唤醒时: 所述判断所述被CPU唤醒的写线程/读线程所对应的缓冲区子区域是否处于所需的访问状态,包括: 判断所述被CPU唤醒的写线程所对应的缓冲区子区域是否处于数据未写入状态;所述将所述被CPU唤醒的写线程/读线程所对应的缓冲区子区域设置为与访问操作对应的访问状态,包括: 将所述被CPU唤醒的写线程所对应的缓冲区子区域设置为数据已写入状态; 当读线程被CPU唤醒时: 所述判断所述被CPU唤醒的写线程/读线程所对应的缓冲区子区域是否处于所需的访问状态,包括: 判断所述被CPU唤醒的读线程所对应的缓冲区子区域是否处于数据已写入状态;所述将所述被CPU唤醒的写线程/读线程所对应的缓冲区子区域设置为与访问操作对应的访问状态,包括: 将所述被CPU唤醒的读线程所对应的缓冲区子区域设置为数据未写入状态。5.—种缓冲区并发访问装置,其特征在于,应用于缓冲区并发访问架构中被唤醒的写线程/读线程;所述缓冲区并发访问架构包括:N个线程访问组,其中,每个线程访问组对应各自的缓冲区子区域,并且,每个线程访问组均包括:一个读线程和一个写线程,所述读线程和所述写线程分别对应有各自的用于获得所述缓冲区的全局锁的条件变量;并且,所述N个线程访问组内的当前被唤醒的写线程/读线程之外的写线程所对应的条件变量和读线程所对应的条件变量均处于阻塞状态;所述装置包括: 条件变量调用模块,用于调用被CPU解除阻塞的条件变量以获得所述缓冲区的全局锁; 访问操作执行模块,用于对所述被CPU唤醒的写线程/读线程所对应的缓冲区子区域执行访问操作; 条件变量释放模块,用于在访问操作执行完毕后,释放所调用的所述条件变量,以使得所述CPU在获知当前被唤醒的写线程/读线程释放所述条件变量后,能够解除执行下一次访问所需的写线程/读线程所对应的条件变量的阻塞。6.根据权利要求5所述的装置,其特征在于,所述访问操作执行模块,包括: 数据写入操作执行单元,用于当写线程被CPU唤醒时,对所述被CPU唤醒的写线程所对应的缓冲区子区域执行数据写入操作; 数据读取操作执行单元,用于当读线程被CPU唤醒时,对所述被CPU唤醒的读线程所对应的缓冲区子区域执行数据读取操作。7.根据权利要求5所述的装置,其特征在于,还包括: 访问状态判断模块,用于在所述访问操作执行模块对所述被CPU唤醒的写线程/读线程所对应的缓冲区子区域执行访问操作之前,判断所述被CPU唤醒的写线程/读线程所对应的缓冲区子区域是否处于所需的访问状态,如果是,触发所述访问操作执行模块; 访问状态设置模块,用于在访问操作执行完毕后,将所述被CPU唤醒的写线程/读线程所对应的缓冲区子区域设置为与访问操作对应的访问状态。8.根据权利要求7所述的装置,其特征在于,所述访问状态判断模块,包括: 第一访问状态判断单元,用于当写线程被CPU唤醒时,在访问操作执行模块对所述被CPU唤醒的写线程所对应的缓冲区子区域执行访问操作之前,判断所述被CPU唤醒的写线程所对应的缓冲区子区域是否处于数据未写入状态,如果是,触发所述访问操作执行模块; 第二访问状态判断单元,用于当读线程被CPU唤醒时,在访问操作执行模块对所述被CPU唤醒的读线程所对应的缓冲区子区域执行访问操作之前,判断所述被CPU唤醒的读线程所对应的缓冲区子区域是否处于数据已写入状态,如果是,触发所述访问操作执行模块; 所述访问状态设置模块,包括: 第一访问状态设置单元,用于当写线程被CPU唤醒时,在访问操作执行完毕后,将所述被CPU唤醒的写线程所对应的缓冲区子区域设置为数据已写入状态; 第二访问状态设置单元,用于当读线程被CPU唤醒时,在访问操作执行完毕后,将所述被CPU唤醒的读线程所对应的缓冲区子区域设置为数据未写入状态。
【专利摘要】本发明实施例公开了一种缓冲区并发访问方法及装置。该方法应用于缓冲区并发访问架构中的被CPU唤醒的写线程/读线程,该架构包括:N个线程访问组,每个线程访问组对应各自的缓冲区子区域,每个线程访问组均包括:一个读线程和一个写线程,读线程和写线程分别对应有各自的用于获得缓冲区的全局锁的条件变量;未被唤醒的写线程和读线程的条件变量均处于阻塞状态;该方法包括:调用被CPU解除阻塞的条件变量以获得缓冲区的全局锁;对自身所对应的缓冲区子区域执行访问操作;在访问操作结束后,释放所调用的条件变量,以使得CPU能够解除执行下一次访问操作所需的写线程/读线程所对应条件变量的阻塞。可见,本方案能够提高缓冲区访问效率。
【IPC分类】G06F13/16, G06F3/06
【公开号】CN104881258
【申请号】CN201510315473
【发明人】潘洪安
【申请人】北京金山安全软件有限公司
【公开日】2015年9月2日
【申请日】2015年6月10日
转载请注明原文地址:https://www.famiwei.com/read-8138815.html