2010-09-12 14 views
7

Mam aplikację asynchroniczną, co oznacza, że ​​w dowolnym momencie może być N zdarzeń. Czy istnieje znany algorytm wzajemnego wykluczania wątków N, bez zakodowania na stałe każdego wątku, który ma identyfikator?Wzajemne wykluczanie dla n asynchronicznych wątków

+0

Przykładem konieczności to będzie za pomocą Local Storage, która jest non-transakcyjnej, a tym samym nie jest bezpieczne, jeśli ta sama strona jest otwarta w wielu kartach . Wdrożenie mutex zachowań z dzielonym pracownikiem może obejść to ograniczenie. –

Odpowiedz

5

Nie sądzę, że JavaScript sam w sobie ma blokowanie obiektów - ponieważ JavaScript jest w zasadzie jednoniciowy. Być może uda Ci się znaleźć bibliotekę lub implementację, która uruchamia kilka wątków kodu Javascript - ale czy wszystkie działają w tej samej przestrzeni zmiennych? Będą musieli jakoś się porozumieć.

Zakładając swoich wielu wątków może podzielić zmienną statyczną mutex jakoś, a ile założyć++” jest uważany operacja atomowa za system, który robi swoje wątków, jak to chodzi?

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

Mogę zrobić zmienną statyczną bez problemu, nie martwiłem się, że nie jestem pewien, że ++ _Was_ jest operacją atomową. Czy wiesz, czy tak jest w przypadku JS? Jeśli to prawda, ten problem jest (jak sądzę) rozwiązalny. Twoja funkcja wygląda tak, jakby to była prawda. – Michael

+0

Na dzień dzisiejszy, chrom nie jest już pojedynczy gwintowany. Spróbuj tego przykładu, użyje on 100% twojego procesora: http://jsfiddle.net/MTJ27/15/ – darkzangel

+0

Czy podany kod może być użyty w obecnej formie? Mam na myśli, że to całkowicie słuszne i może być używane w trybie produkcji? –

3

JavaScript jest generalnie pojedynczy, więc nigdy nie masz dwóch kawałków kodu modyfikujących te same dane w tym samym czasie. Możesz używać wielu wątków we współczesnych przeglądarkach przy użyciu Web Workers, ale mogą one komunikować się tylko przekazując wiadomości, nie dzieląc się pamięcią, więc nie musisz się martwić wzajemnym wykluczeniem, jeśli używasz pracowników internetowych.

+0

W rzeczywistości używam pracowników sieciowych, ale to nie ma znaczenia. Martwię się, jeśli funkcja onMessage zostanie wywołana dwa razy. Chociaż może to być "pojedynczy wątek", czy nie będzie przerywany wątkiem dwóch wywołań, jeśli w końcu zostaną uruchomione w tym samym okresie czasu? – Michael

+0

@Michael Z jakiego zasobu próbujesz chronić dostęp za pomocą wzajemnego wykluczenia? –

+0

Powiedzmy, że mam jakąś globalną tablicę i muszę w niej coś zapisać i zwrócić indeks przechowywanego przedmiotu. Zazwyczaj sprawdzam długość, wciskam ją do tablicy i zwracam długość tablicy. Ale jeśli drugi wątek (który został wywołany ze względu na asynchroniczne zdarzenie) zostanie przełączony między otrzymaniem długości tablicy, a wypchnięciem nowej wartości do tablicy i wykona to samo, pierwsza funkcja zwróci zły indeks. – Michael

2

Może być pojedynczym gwintem, ale czasami występuje problem, gdy niektóre akcje użytkownika uruchamiają wiele wątków, których chcielibyśmy uniknąć (na przykład żądania AJAX). Jeśli chcielibyśmy stworzyć semafor, możemy użyć zmiennej globalnej. W każdym razie, jestem pewien, że nie powinno się tego robić w ten sposób - po prostu nie znam lepszego rozwiązania, ponieważ nie jestem tak bardzo zaangażowany w JS.

nadzieję, że to pomoże Ci w prostych sytuacjach:

<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> 
+0

, więc 'magic_switch()' jest atomowe? –

Powiązane problemy