Multithreading 非阻塞多线程同步的无锁、无等待和无等待算法
在多线程编程中,我们可以找到两个或多个线程/任务之间数据传输同步的不同术语 确切地说,我们可以说某些算法是:Multithreading 非阻塞多线程同步的无锁、无等待和无等待算法,multithreading,delphi,synchronization,delphi-2007,Multithreading,Delphi,Synchronization,Delphi 2007,在多线程编程中,我们可以找到两个或多个线程/任务之间数据传输同步的不同术语 确切地说,我们可以说某些算法是: 1)Lock-Free 2)Wait-Free 3)Wait-Freedom 我理解什么是无锁,但当我们可以说某些同步算法是无等待还是无等待时? 我为多线程同步编写了一些代码(环形缓冲区),它使用无锁方法,但: 算法预测此例程的最大执行时间 在开始时调用此例程的线程设置唯一引用(在此例程内部) 调用同一例程的其他线程检查此引用,如果设置了此引用,则计算第一个相关线程的CPU周期计数(测
1)Lock-Free
2)Wait-Free
3)Wait-Freedom
我理解什么是无锁,但当我们可以说某些同步算法是无等待还是无等待时?
我为多线程同步编写了一些代码(环形缓冲区),它使用无锁方法,但:
function TgjRingBuffer.InsertLeft(const link: pointer): integer;
var
AtStartReference: cardinal;
CPUTimeStamp : int64;
CurrentLeft : pointer;
CurrentReference: cardinal;
NewLeft : PReferencedPtr;
Reference : cardinal;
label
TryAgain;
begin
Reference := GetThreadId + 1; //Reference.bit0 := 1
with rbRingBuffer^ do begin
TryAgain:
//Set Left.Reference with respect to all other cores :)
CPUTimeStamp := GetCPUTimeStamp + LoopTicks;
AtStartReference := Left.Reference OR 1; //Reference.bit0 := 1
repeat
CurrentReference := Left.Reference;
until (CurrentReference AND 1 = 0)or (GetCPUTimeStamp - CPUTimeStamp > 0);
//No threads present in ring buffer or current thread timeout
if ((CurrentReference AND 1 <> 0) and (AtStartReference <> CurrentReference)) or
not CAS32(CurrentReference, Reference, Left.Reference) then
goto TryAgain;
//Calculate RingBuffer NewLeft address
CurrentLeft := Left.Link;
NewLeft := pointer(cardinal(CurrentLeft) - SizeOf(TReferencedPtr));
if cardinal(NewLeft) < cardinal(@Buffer) then
NewLeft := EndBuffer;
//Calcolate distance
result := integer(Right.Link) - Integer(NewLeft);
//Check buffer full
if result = 0 then //Clear Reference if task still own reference
if CAS32(Reference, 0, Left.Reference) then
Exit else
goto TryAgain;
//Set NewLeft.Reference
NewLeft^.Reference := Reference;
SFence;
//Try to set link and try to exchange NewLeft and clear Reference if task own reference
if (Reference <> Left.Reference) or
not CAS64(NewLeft^.Link, Reference, link, Reference, NewLeft^) or
not CAS64(CurrentLeft, Reference, NewLeft, 0, Left) then
goto TryAgain;
//Calcolate result
if result < 0 then
result := Length - integer(cardinal(not Result) div SizeOf(TReferencedPtr)) else
result := cardinal(result) div SizeOf(TReferencedPtr);
end; //with
end; { TgjRingBuffer.InsertLeft }
函数TgjRingBuffer.InsertLeft(const-link:pointer):整数;
变量
AtStartReference:红衣主教;
CPUTimeStamp:int64;
CurrentLeft:指针;
当前参考:红衣主教;
新左派:首选DPTR;
参考:红衣主教;
标签
特里亚根;
开始
引用:=GetThreadId+1//Reference.bit0:=1
使用rbRingBuffer ^do开始
TryAgain:
//向左设置。相对于所有其他核心的参考:)
CPUTimeStamp:=GetCPUTimeStamp+LoopTicks;
AtStartReference:=左参考或1//Reference.bit0:=1
重复
CurrentReference:=左。参考;
直到(CurrentReference和1=0)或(GetCPUTimeStamp-CPUTimeStamp>0);
//环缓冲区中不存在线程或当前线程超时
如果((CurrentReference和1 0)和(AtStartReference CurrentReference))或
不是CAS32(CurrentReference,Reference,Left.Reference)那么
goto TryAgain;
//计算RingBuffer NewLeft地址
CurrentLeft:=左.链接;
NewLeft:=指针(基数(CurrentLeft)-SizeOf(TReferencedPtr));
如果基数(NewLeft)
您可以在这里找到环缓冲区单元:,CAS函数:,以及测试程序:(我回答这个问题的前提是假设它是一个家庭作业问题,如果不是,请提供您遇到的问题的更多细节)
你应该开始阅读维基百科上的文章。这提供了一些很好的背景信息和你提到的术语的一些定义。我将对此进行研究,尽管我没有经过正式培训,也不在乎这是否是家庭作业,因为op要求的是确定“什么算法”,对我来说(海报框定了工作)是“无等待状态”涉及执行元组的编程——这正是系统编程必须解决的问题