Каков класс поточной обработки, если я просто хочу протестировать и установить флаг ориентированным на многопотоковое исполнение способом?

Я просто хочу сделать простое, хотя ориентированный на многопотоковое исполнение, булев тест (и установите), так:

if(myBoolean==false)   //should not lock/wait!
{ 
     myBoolean=true;
     .....
}
else
{
     ....
}

Я рассмотрел следующее (хотя возможно неправильно, поэтому исправьте меня, где я неправильно понял),

  • использование Блокировки {если (myBoolean)...} конструкция походит на излишество способ сделать это. И, это также блокирует поток, в то время как это ожидает блокировки для становления свободным. Я не хочу это.
  • Класс AutoResetEvent действительно имеет понятие булева состояния, но он используется для передачи сигналов о другом потоке, который ожидает. Так не релевантный в моем случае
  • Семафорный класс имеет понятие подсчета ссылок (вероятно, для регулировки суммы доступа к ресурсу?). Так, вероятно, не, что я после.
  • Взаимоисключающий класс. Насколько я понял, это - тот же принципал как примитивная Блокировка

У кого-либо есть идея, что класс/конструкция должен сделать это эффективным способом?

5
задан Toad 15 January 2010 в 15:28
поделиться

4 ответа

Рассмотрим Interlocked.compareexchange .

8
ответ дан 18 December 2019 в 09:07
поделиться

Ответ ( intelocked.compareexchange ) уже был дан, но вот пример моего использования:

private int _isDisposing;

public bool IsDisposing
{
    get
    {
        return this._isDisposing != 0;
    }
}

public void Dispose()
{
    // Side note: I may want to `return` instead of `throw`
    if (Interlocked.CompareExchange(ref _isDisposing, 1, 0) != 0)
        throw new InvalidOperationException("Dispose was recursively called.");

    try
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }
    finally
    {
        _isDisposing = 0;
    }
}
6
ответ дан 18 December 2019 в 09:07
поделиться

ASP.net запускается на сервере - он просто генерирует HTML (& JavaScript), который отправляется клиенту (например, браузеру) и визуализируется там.

Так что вам нужно не asp.net решение, а действительно богатое клиентское решение. Некоторые из ваших вариантов:

  • Javascript
  • Flash
  • Silverlight
  • Java-апплет

Я подозреваю, что Javascript или Silverlight будут представлять для вас наибольший интерес. Возможно, вы хотите провести небольшое расследование и вернуться с обновленным вопросом.

UPDATE Re: Bob's Comment:

Быстрый google нашел это, что кажется довольно классным:

Облегченные визуальные тезаурасы

-121--4244800-

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

-121--693095-

Ваш вопрос несколько неоднозначен, но вы, вероятно, ищете класс Blocked .

EDIT : Требуется Interlocked.CompeyExchange .

2
ответ дан 18 December 2019 в 09:07
поделиться

Чтобы иметь резьбовую безопасную тест и установить операцию, код должен заблокировать другие потоки. Чтобы избежать блокировки нецелесообразных, вы можете использовать шаблон Test-and-Test-and-Set:

if (something) {
   lock(_sync) {
      if (something) {
         something = false;
         ...
      }
   }
}

Второй тест должен быть уверен, что какой-то другой нить не изменил значение между первым тестом и блокировкой.

1
ответ дан 18 December 2019 в 09:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: