이것은 a
2 개의 웹 작업자가 SharedArrayBuffer 및 일부 주요 스크립트를 통해 변수 에 액세스하는 경우 가능합니다 . 가능성은 낮지 만 코드를 기계어 코드로 컴파일 할 때, 웹 노동자 변수를 업데이트하는 것이 가능하다 a
단지 조건 때문에 시간에 a==1
, a==2
그리고 a==3
만족하고 있습니다.
이것은 웹 워커와 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 억 회 반복 된 후에 발생합니다.
두 번째 시도 :
내가 말했듯이, 기회는 적지 만 충분한 시간이 주어지면 조건에 부딪 칠 것입니다.
팁 : 시스템에 시간이 너무 오래 걸리는 경우 시도 만하고로 a == 1 && a == 2
변경 Math.random()*3
하십시오 Math.random()*2
. 목록에 점점 더 추가하면 타격 가능성이 줄어 듭니다.