Javascript N个异步线程的互斥

Javascript N个异步线程的互斥,javascript,multithreading,asynchronous,Javascript,Multithreading,Asynchronous,我有一个异步应用程序,这意味着在任何给定的时间都可能有N个事件。有没有一种已知的算法可以对N个线程进行互斥,而不必对每个线程进行硬编码以使其具有ID?我认为Javascript本身没有对象锁定,因为Javascript基本上是单线程的。您可能会找到一个运行多个Javascript代码线程的库或实现,但它们是否都在同一个变量空间中运行?他们需要以某种方式相互沟通 假设您的多个线程可以以某种方式共享一个静态的互斥体变量,并且只要您假设“++”被认为是执行线程的系统的原子操作,这如何 int mute

我有一个异步应用程序,这意味着在任何给定的时间都可能有N个事件。有没有一种已知的算法可以对N个线程进行互斥,而不必对每个线程进行硬编码以使其具有ID?

我认为Javascript本身没有对象锁定,因为Javascript基本上是单线程的。您可能会找到一个运行多个Javascript代码线程的库或实现,但它们是否都在同一个变量空间中运行?他们需要以某种方式相互沟通

假设您的多个线程可以以某种方式共享一个静态的
互斥体
变量,并且只要您假设
++
”被认为是执行线程的系统的原子操作,这如何

int mutex = 0;
mutuallyExclusiveOperation(){
  succeed=false;
  while(!succeed){
    while(mutex>0){ sleep();  }
    m=mutex++;   //"Simultaneously" read and increment
    if(m>0)mutex--;
    else{
      doMutuallyExclusiveThing();
      succeed=true;
      mutex--;
    }
 }
}

JavaScript通常是单线程的,因此您永远不会有两段代码同时修改相同的数据。在使用Web Workers的现代浏览器中,您可以使用多个线程,但它们只能通过传递消息进行通信,而不能共享内存,因此,如果您使用web workers,就不必担心互斥问题。

可以是单线程的,但有时在某些用户操作运行我们希望避免的多线程时会出现问题(例如AJAX请求)。如果我们想制作一个信号量,我们可以使用一个全局变量。无论如何,我肯定不应该这样做——我只是不知道有什么更好的解决方案,因为我没有太多地参与JS

希望它能在一些简单的情况下帮助您:

<html>

 <head>
  <script type="text/javascript">
        var magic_global;
        magic_global = true;

        function magic_switch() {
                magic_global = !magic_global;
        }
  </script>
 </head>

 <body>
        <a href="#" onclick="magic_switch();">switch Magic</a>
        <a href="#" onclick="alert(magic_global);">show the Magic</a>
 </body>

</html>

var magic_global;
魔幻全球=真;
函数magic_开关(){
magic_global=!magic_global;
}

我实际上是在利用网络工作者,但这与问题无关。我担心的是onMessage函数会被调用两次。虽然它可能是“单线程”的,但如果两个调用在同一时间段内运行,它不会断断续续地对其进行线程化吗?@Michael您试图通过互斥来保护对哪些资源的访问?假设我有一些全局数组,我需要在其中存储一些内容,并返回存储的项的索引。通常,我会检查长度,将其推入数组,然后返回数组的长度。但是,如果第二个线程(由于异步事件调用)在获取数组长度和将新值推送到数组之间进入线程,并且执行相同的操作,第一个函数将返回错误的索引。我可以执行静态变量,没有问题,我担心的不是我不确定++是否是一个原子操作。你知道JS的情况是否如此吗?如果这是真的,这个问题(我相信)是可以解决的。实际上,你的功能看起来是正确的。到今天为止,chrome不再是单线程的。试试这个例子,它将使用100%的处理器:您提供的代码可以按原样使用吗?我的意思是它完全正确并且可以在生产模式中使用?我希望
++
的行为取决于使用哪个Javascript解释器。如果我用这段代码发射宇宙飞船,我会a)在要使用的特定浏览器上运行大量线程测试,b)检查解释器代码本身。如果解释器的多个实例在不同的实际操作系统线程中运行,正如@darkzagnel所建议的那样,那么也许就不可能有一个万无一失的解决方案,除非你能找到一个真正的原子JS读写操作。实际上,不要担心互斥和诸如此类的东西。只有当您使用worker并且worker不与您的代码共享数据时,Chrome才是多线程的。您必须使用端口和信号将数据传递给它。他们没有访问dom、窗口、文档或任何其他变量的权限。需要使用本地存储就是一个例子,本地存储是非事务性的,因此如果在多个选项卡中打开同一页,则不安全。使用共享工作线程实现互斥行为可以绕过这一限制。