Инспектор Intel сообщает о гонке данных в моей реализации спин-блокировки

Подробно останавливание предыдущий ответ для предотвращения O (n 2 глоток>) приближается путем явного использования переданного итератора:

public static IEnumerable> Tuples(this IEnumerable input, int groupCount) {
  if (null == input) throw new ArgumentException("input");
  if (groupCount < 1) throw new ArgumentException("groupCount");

  var e = input.GetEnumerator();

  bool done = false;
  while (!done) {
    var l = new List();
    for (var n = 0; n < groupCount; ++n) {
      if (!e.MoveNext()) {
        if (n != 0) {
          yield return l;
        }
        yield break;
      }
      l.Add(e.Current);
    }
    yield return l;
  }
}

Для C# 2, перед дополнительными методами, отбрасывают "это" от входного параметра и вызова как статический метод.

8
задан Max Galkin 9 December 2014 в 00:02
поделиться

2 ответа

В документации Parallel Inspector для гонки данных предлагается использовать критическую секцию или мьютекс для устранения гонок в Windows. В нем нет ничего, что предполагало бы, что Parallel Inspector знает, как распознать любой другой механизм блокировки, который вы можете изобрести.

Инструменты для анализа новых механизмов блокировки, как правило, представляют собой статические инструменты, которые просматривают все возможные пути прохождения кода; документация Parallel Inspector подразумевает, что он выполняет код один раз.

Если вы хотите поэкспериментировать с новыми механизмами блокировки, наиболее распространенным инструментом, который я видел в академической литературе, является Проверка модели спина . Также есть ESP , который может уменьшить пространство состояний, но я не знаю, применялся ли он к параллельным проблемам, а также инструментальные средства мобильности , которые предоставят анализ, если вы сможете сформулировать свою проблему с помощью пи-исчисления. Intel Parallel Inspector не кажется таким сложным, как эти инструменты, он скорее предназначен для проверки на наличие часто встречающихся проблем с помощью эвристики.

4
ответ дан 5 December 2019 в 21:20
поделиться

Я почти уверен, что это должно быть реализовано следующим образом:

class SpinLock
{
   long lockValue;
   SpinLock(long value) : lockValue(value) { }

   void Lock() {
      while(InterlockedCompareExchange(&lockValue, 1, 0) != 0) {
          WaitABit();
      }
   }

   void Unlock() { InterlockedExchange(&lockValue, 0); }
};
1
ответ дан 5 December 2019 в 21:20
поделиться
Другие вопросы по тегам:

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