Взаимное исключение для N асинхронных потоков - PullRequest
7 голосов
/ 12 сентября 2010

У меня есть асинхронное приложение, означающее, что в любой момент времени может быть N событий.Существует ли известный алгоритм для взаимного исключения для N потоков без жесткого кодирования каждого потока, чтобы иметь идентификатор?

Ответы [ 3 ]

5 голосов
/ 12 сентября 2010

Я не думаю, что 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--;
    }
 }
}
3 голосов
/ 12 сентября 2010

JavaScript обычно однопоточный, поэтому у вас никогда не будет двух частей кода, изменяющих одни и те же данные одновременно.Вы можете использовать несколько потоков в современных браузерах с использованием веб-работников, но они могут обмениваться информацией только путем передачи сообщений, не разделяя память, поэтому вам не нужно беспокоиться о взаимном исключении, если вы используете веб-работников.

2 голосов
/ 21 марта 2012

Может быть однопоточным, но иногда возникает проблема, когда некоторые пользовательские действия запускают несколько потоков, которых мы хотели бы избежать (например, 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...