思路:使用一个标志变量来表示当前是否有线程占用了锁,如果有则等待,直到锁被释放;使用一个等待队列来记录等待锁的线程,当锁被释放时,从队列中取出一个线程来占用锁。

代码如下:

type ReleaseFn = () => void;

class Mutex { private locked: boolean = false; private waitingQueue: (() => void)[] = [];

async acquire(): Promise { return new Promise((resolve) => { const acquireLock = () => { if (!this.locked) { this.locked = true; resolve(() => { this.locked = false; const next = this.waitingQueue.shift(); if (next) { next(); } }); } else { this.waitingQueue.push(acquireLock); } }; acquireLock(); }); } }

/*

  • --- 测试部分 --- */ export async function doTest() { try { const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms)); const mutex = new Mutex();

    let shareState = []; // 创建一个 worker // 每个 worker 循环5次处理 globalState // 通过锁机制,保证其他 worker 处理的是当前 worker 处理后的 globalState const createWorker = async (delay, char) => { let workerCopyState; // 循环5次 for (let i = 0; i < 5; i++) { const release = await mutex.acquire(); workerCopyState = shareState.slice(); await sleep(delay); workerCopyState.push(char); shareState = workerCopyState.slice(); await sleep(delay); release(); } };

    await Promise.all([createWorker(7, 'a'), createWorker(11, 'b')]); assert.equal(shareState.join(''), 'ababababab'); return true; } catch (err) { console.error(err); return false; } }

import assert from power-assert; --- 问题描述 --- Mutex互斥锁是一种用于并发编程的同步原语用于保护共享资源的访问。 请根据描述和测试用例实现一个简易的 Mutex互斥锁。 type ReleaseFn = = void;class Mutex async acquire PromiseReleaseFn --- 测试部分 --- exp

原文地址: https://www.cveoy.top/t/topic/bKwZ 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录