JavaScript中的关键部分(多线程)

时间:2015-12-05 07:34:37

标签: javascript multithreading race-condition

我认为我不需要在JavaScript中处理同步问题和关键部分,因为它是单线程的。嗯......

问题

多个网站将数据发送到多个本地托管的页面,这些页面同时访问同一块内存,从而导致竞争状态。

这是我刚写的一个简单的代码,可让两个孩子计算结果并将其发送回父母:

window.addEventListener("load", function() {
    //threads analogy in JavaScript!
    if (location.search.length) {
        //receiver
        var query = decodeURIComponent(location.search.slice(1));
        var data = JSON.parse(query).value;

        //handle data.
        //start CRITICAL SECTION
        localStorage.storage = +localStorage.storage + data;
        //end CRITICAL SECTION

        location.href = "about:blank"; //exit
    } else {
        //master
        sum = document.getElementById("sum");
        sum.innerText = localStorage.storage = "0";

        window.addEventListener("storage", function() {
            //data received from receiver
            sum.innerText = localStorage.storage;
        });
    }
});

多个页面将计算一个数字并发送回父母:

var frame = document.createElement("iframe");
frame.src = 'http://localhost:8080/master.html?{"value":1}';    //port 8080
document.body.appendChild(frame);
var n=0;
frame.addEventListener("load", function(){
    if(n) document.body.removeChild(frame);
    else  n=1;
}

由于localStorage在同一个域的页面之间共享,并且所有这些页面都在不同的线程上运行,因此在JavaScript中会导致竞争条件。

我尝试创建2个实例,每个实例同时并连续发回10次1的值。我最后得到的结果总是少于20个。

在C中,有一个互斥体来拯救我们的生命。如何在没有锁定机制的JavaScript中解决这个问题?

此图表可能更容易理解:

0 个答案:

没有答案