これはa
、SharedArrayBufferといくつかのメインスクリプトを介して、たとえば2つのWebワーカーが変数にアクセスする場合に可能です。可能性は低いですが、コードはマシンコードにコンパイルされたときに、ウェブの労働者が変数を更新することも可能であるa
条件ので、時間だけでa==1
、a==2
そしてa==3
満足しています。
これは、Webワーカーと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')
})
modifier.js
addEventListener('message' , ({data}) => {
setInterval( () => {
new Uint8Array(data)[0] = Math.floor(Math.random()*3) + 1
})
})
私のMacBook Airでは、それは最初の試みでおよそ100億回の繰り返しの後に起こります:
2回目の試み:
言ったように、可能性は低くなりますが、十分な時間が与えられれば、それは条件にヒットします。
ヒント:システムで時間がかかりすぎる場合。のみa == 1 && a == 2
を試してに変更Math.random()*3
してくださいMath.random()*2
。リストにどんどん追加すると、ヒットする可能性が低くなります。