Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 实现递归锁_Javascript_Typescript_Async Await - Fatal编程技术网

Javascript 实现递归锁

Javascript 实现递归锁,javascript,typescript,async-await,Javascript,Typescript,Async Await,我已经创建了一个可同步的mixin,它提供了synchronized功能: const lock = Symbol('Synchronizable lock'); const queue = Symbol('Synchronizable queue'); export class Synchronizable { private [lock] = false; private [queue]: Array<() => void> = []; public asy

我已经创建了一个可同步的mixin,它提供了
synchronized
功能:

const lock = Symbol('Synchronizable lock');
const queue = Symbol('Synchronizable queue');

export class Synchronizable {
  private [lock] = false;
  private [queue]: Array<() => void> = [];

  public async synchronized<T>(fn: () => Promise<T>): Promise<T> {
    while (true) {
      if (this[lock]) await new Promise(resolve => this[queue].push(resolve));
      else {
        this[lock] = true;
        try {
          return await fn();
        } finally {
          this[lock] = false;
          const tmp = this[queue];
          this[queue] = [];
          tmp.forEach(e => e());
        }
      }
    }
  }
}
如何实现递归锁? 完整的代码与testcases一起上传到

第一个想法 就像任何其他语言一样,在锁定时保存当前线程id,然后将保存的线程id与当前线程id进行比较,如果匹配继续

但是javascript不提供线程id,延迟闭包也不会生成新id

再三考虑 跟踪调用堆栈,找到堆栈中的任何其他锁调用,检查它是否是同一个锁


问题是堆栈跟踪可能不会跟随回调,比如
setTimeout
,因此它无法在回调之前检测到锁。

我发现可以使用Zone.js实现第一种方法,Zone.js提供了一种定义线程局部变量的方法。

@Rajesh您可以尝试测试用例,这是绝对必要的。测试用例还演示了用例。@臧明杰,为什么在单线程环境中需要锁?@Dmitry请参阅测试用例,这些测试用例还演示了用例。@臧明杰,在单线程环境中不需要锁。在计算机科学的维基百科中,锁或互斥锁(来自互斥)是一种同步机制,用于在存在多个执行线程的环境中强制限制对资源的访问。锁是用来强制执行互斥并发控制策略的。那么,在递归情况下,您希望发生什么呢?例外?
const c = new Synchronizable();
await c.synchronized(() => c.synchronized(async () => void 0));