විචල්ය a
ප්රවේශයට ප්රවේශ විය හැකි අවස්ථාවකදී මෙය කළ හැකි බව SharedArrayBuffer හරහා වෙබ් සේවකයින් දෙදෙනෙකු මෙන්ම සමහර ප්රධාන ස්ක්රිප්ට් එකකින් කියන්න. හැකියාව අඩු වන නමුත් එය කේතය යාන්ත්රික කේත කිරීමට සකස් කරන විට, වෙබ් කම්කරුවන් විචල්ය යාවත්කාලීන බව හැකි ය a
කොන්දේසි එසේ හුදෙක් කාලය තුළ a==1
, a==2
හා a==3
සෑහීමකට පත් වේ.
වෙබ් සේවකයින් සහ ජාවාස්ක්රිප්ට් හි 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)
workers.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
})
})
මගේ මැක්බුක් වාතය තුළ, එය සිදු වන්නේ පළමු උත්සාහයේදී බිලියන 10 ක් පමණ පුනරාවර්තනය කිරීමෙන් පසුව ය:
දෙවන උත්සාහය:
මා කී පරිදි, අවස්ථා අඩු වනු ඇත, නමුත් ප්රමාණවත් කාලයක් ලබා දීමෙන් එය තත්වයට පත්වනු ඇත.
ඉඟිය: ඔබේ පද්ධතියට වැඩි කාලයක් ගත වුවහොත්. පමණක් උත්සාහ a == 1 && a == 2
කර වෙනස් Math.random()*3
කරන්න Math.random()*2
. ලැයිස්තුගත කිරීම සඳහා වැඩි වැඩියෙන් එකතු කිරීමෙන් පහර දීමේ අවස්ථාව පහත වැටේ.