สิ่งนี้เป็นไปได้ในกรณีที่ตัวแปรa
ถูกเข้าถึงโดยพูดกับผู้ทำงานเว็บ 2 คนผ่าน SharedArrayBuffer และสคริปต์หลักบางตัว ความเป็นไปได้ต่ำ แต่ก็เป็นไปได้ว่าเมื่อรหัสจะรวบรวมรหัสเครื่องคนงานเว็บปรับปรุงตัวแปรa
เพียงในเวลาดังนั้นเงื่อนไขa==1
, a==2
และa==3
มีความพึงพอใจ
นี่อาจเป็นตัวอย่างของสภาวะการแย่งชิงในสภาพแวดล้อมแบบมัลติเธรดที่จัดทำโดยเว็บเวิร์คและ SharedArrayBuffer ใน JavaScript
นี่คือการใช้งานพื้นฐานด้านบน:
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 ของฉันมันเกิดขึ้นหลังจากมีการทำซ้ำประมาณ 10,000 ล้านครั้งในครั้งแรก:
ความพยายามครั้งที่สอง:
อย่างที่ฉันบอกว่าโอกาสจะต่ำ แต่ให้เวลามากพอมันจะกระทบกับเงื่อนไข
เคล็ดลับ: หากระบบของคุณใช้เวลานานเกินไป ลองเท่านั้นa == 1 && a == 2
และเปลี่ยนไปMath.random()*3
Math.random()*2
เพิ่มมากขึ้นในรายการลดโอกาสในการกดปุ่ม