当前位置:  开发笔记 > 编程语言 > 正文

Javascript信号量/测试和设置/锁定?

如何解决《Javascript信号量/测试和设置/锁定?》经验,为你挑选了1个好方法。

在Javascript中是否存在原子测试和设置,信号量或锁定这样的事情?

我有javascript通过自定义协议调用异步后台进程(后台进程实际上在一个单独的进程中运行,与浏览器无关).我相信我遇到了竞争状态; 后台进程在我的测试和我的设置之间返回,在javascript端搞砸了.我需要一个测试和设置操作来使它成为一个真正的信号量.

这是尝试检测后台进程并将其排队的javascript代码:

Call = function () {

var isRunning = true,
    queue = [];

return  {
    // myPublicProperty: "something",

    call: function (method) {
            if (isRunning) {
                console.log("Busy, pushing " + method);
                queue.push(method);
            } else {
                isRunning = true;
                objccall(method);
            }
        },

        done: function() {
            isRunning = false;
            if (queue.length > 0) {
                Call.call(queue.shift());
            }
        }
    };
}();

呼叫是一个实现排队的单身人士; 任何想要调用外部进程的人都会调用Call.call("something").

有任何想法吗?



1> olliej..:

JavaScript没有锁定语义,因为JS不是多线程语言.多个线程只能在完全不同的上下文中同时操作 - 例如.HTML5工作线程,或者像JavaScriptCore API的上下文对象的多个实例(我假设SpiderMonkey有类似的概念).它们不能具有共享状态,因此实质上所有执行都是原子的.

好的,因为你现在已经提供了一些代码,我假设你有类似的东西:

External Process:
.isRunning = true;
doSomething()
.done()

或者一些这样的(使用适当的API).在这种情况下,如果JS在js对象的上下文中执行(这是JavaScriptCore会做的事情),我会期望JS引擎阻塞,如果没有你可能需要在js执行周围放置一个手动锁.

您使用什么引擎来完成所有这些?我问,因为基于你的描述,听起来你正在使用该语言提供的C/C++ API从非JS语言的辅助线程设置一个标志,并且大多数JS引擎都假设通过API进行的任何状态操作将发生在单个线程上,通常是所有执行发生的相同线程.

推荐阅读
云聪京初瑞子_617
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有