Как реализовать свой собственный механизм блокировки

Для назначения (это для параллелизма, если вам интересно) - я должен реализовать свою собственную блокировку

(более конкретно: TaS, TTas и Array-Lock, как описано в «Искусство многопроцессорного программирования»)

В сети есть несколько тестовых схем ввода и вывода, которые я пробовал (жаль, что их пробовать довольно долго).

Ваша программа должна подсчитывать 9-значные числа, которые проходят определенный тест

(на голландском это называется elfproef, я не знаю английского эквивалента, извините).

Иногда я получаю немного другое число, что говорит о том, что моя блокировка не работает на 100% .

Я реализовал блокировки следующим образом:

interface Lock
{
    void Lock();
    void Unlock();
}

class TaSLock : Lock
{
    AtomicBool state = new AtomicBool(false);

    void Lock.Lock()
    { while (state.getAndSet(true)); }

    void Lock.Unlock()
    { state.getAndSet(false); }
}

AtomicBool реализован с целым числом , потому что класс Interlocked не имеет операций для Логические переменные. Это не оптимально с точки зрения использования памяти, но не имеет (или не должно) иметь значения для скорости.

class AtomicBool
{
    int value;
    static int True = 1, False = -1;

    public AtomicBool(bool value)
    {
        if (value) this.value = True;
        else this.value = False;
    }

    public void set(bool newValue)
    {
        if (newValue) Interlocked.Exchange(ref value, True);
        else Interlocked.Exchange(ref value, False);
    }

    public bool getAndSet(bool newValue)
    {
        int oldValue;
        if (newValue) oldValue = Interlocked.Exchange(ref value, True);
        else oldValue = Interlocked.Exchange(ref value, False);
        return (oldValue == True);
    }

    public bool get()
    {
        return (Interlocked.Add(ref value, 0) == 1);
    }
}

Теперь в параллельной части, которую я только что использовал:

theLock.Lock();
counter++;
theLock.Unlock();

Но каждый раз я получаю немного разные результаты.

Есть ли что-то очевидное, что я делаю неправильно?

5
задан Bill the Lizard 20 September 2012 в 21:05
поделиться