import assert from power-assert; --- 问题描述 --- Mutex互斥锁是一种用于并发编程的同步原语用于保护共享资源的访问。 请根据描述和测试用例实现一个简易的 Mutex互斥锁。 type ReleaseFn = = void;class Mutex async acquire PromiseReleaseFn --- 测试部分 --- exp
思路:使用一个标志变量来表示当前是否有线程占用了锁,如果有则等待,直到锁被释放;使用一个等待队列来记录等待锁的线程,当锁被释放时,从队列中取出一个线程来占用锁。
代码如下:
type ReleaseFn = () => void;
class Mutex { private locked: boolean = false; private waitingQueue: (() => void)[] = [];
async acquire(): Promise
/*
-
--- 测试部分 --- */ 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; } }
原文地址: https://www.cveoy.top/t/topic/bKwZ 著作权归作者所有。请勿转载和采集!