N个异步线程的互斥

时间:2010-09-12 02:45:23

标签: javascript multithreading asynchronous

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

3 个答案:

答案 0 :(得分:5)

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

假设您的多个线程可以以某种方式共享静态mutex变量,并且只要您假设'++'被视为原子操作对于正在进行线程处理的系统,这个怎么样?

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--;
    }
 }
}

答案 1 :(得分:3)

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

答案 2 :(得分:2)

可以是单线程但有时当某些用户操作正在运行我们希望避免的多个线程时(例如,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>