如果有a
2个Web工作者通过SharedArrayBuffer以及一些主脚本访问变量,则可以这样做。的可能性较低,但有可能的是,当代码被编译成机器代码,网络工作者更新变量a
只是在时间上的条件a==1
,a==2
和a==3
得到满足。
这可以是由Web worker和JavaScript中的SharedArrayBuffer提供的多线程环境中竞争条件的示例。
这是上面的基本实现:
main.js
// Main Thread
const worker = new Worker('worker.js')
const modifiers = [new Worker('modifier.js'), new Worker('modifier.js')] // Let's use 2 workers
const sab = new SharedArrayBuffer(1)
modifiers.forEach(m => m.postMessage(sab))
worker.postMessage(sab)
worker.js
let array
Object.defineProperty(self, 'a', {
get() {
return array[0]
}
});
addEventListener('message', ({data}) => {
array = new Uint8Array(data)
let count = 0
do {
var res = a == 1 && a == 2 && a == 3
++count
} while(res == false) // just for clarity. !res is fine
console.log(`It happened after ${count} iterations`)
console.log('You should\'ve never seen this')
})
修饰符
addEventListener('message' , ({data}) => {
setInterval( () => {
new Uint8Array(data)[0] = Math.floor(Math.random()*3) + 1
})
})
在我的MacBook Air上,第一次尝试经过约100亿次迭代后,它才发生:
第二次尝试:
就像我说的那样,机会很少,但是如果有足够的时间,它将达到条件。
提示:如果您的系统花费的时间太长。仅尝试a == 1 && a == 2
并更改Math.random()*3
为Math.random()*2
。在列表中添加越来越多的内容会降低命中率。