चर a
द्वारा एक्सेस किए जाने के मामले में यह संभव है, 2 वेब कर्मचारियों को एक 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)
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
})
})
मेरे मैकबुक एयर पर, पहले प्रयास में लगभग 10 बिलियन पुनरावृत्तियों के बाद ऐसा होता है:
दूसरा प्रयास:
जैसा कि मैंने कहा, संभावना कम होगी, लेकिन पर्याप्त समय दिया गया, यह स्थिति को प्रभावित करेगा।
युक्ति: यदि आपके सिस्टम पर बहुत लंबा समय लगता है। केवल प्रयास करें a == 1 && a == 2
और परिवर्तन Math.random()*3
करने के लिए Math.random()*2
। अधिक से अधिक सूची में जोड़ने से मारने की संभावना कम हो जाती है।