在这里用一个局部变量localsynclist来交换synclist,这里用的也是一个原语:interlockedexchange。同样,这里也是用临界区将对synclist的访问保护起来。
只要localsynclist不为空,则通过一个循环来依次处理累积的所有同步方法调用。最后把处理完的localsynclist释放掉,退出临界区。
再来看对同步方法的处理:首先是从列表中移出(取出并从列表中删除)第一个同步方法调用数据。然后退出临界区(原因当然也是为了防止死锁)。
接着就是真正的调用同步方法了。
如果同步方法中出现异常,将被捕获后存入同步方法数据记录中。
重新进入临界区后,调用setevent通知调用线程,同步方法执行完成了(详见前面synchronize中的waitforsingleobject调用)。
至此,整个synchronize的实现介绍完成。
最后来说一下waitfor,它的功能就是等待线程执行结束。其代码如下:
function tthread.waitfor: longword;
var
h: array[0..1] of thandle;
waitresult: cardinal;