Неожиданное ПРЕДУПРЕЖДЕНИЕ: ThreadSanitizer: раса данных [дубликат]

Вы должны посмотреть на инверсию управления:

В таком сценарии вы не будете писать это:

IInterface classRef = new ObjectWhatever();

Вы бы написали что-то вроде этого:

IInterface classRef = container.Resolve();

Это приведет к установке на основе правил в объекте container и построит для вас фактический объект, который может быть ObjectWhatever. Важно то, что вы могли бы заменить это правило тем, что вообще использовали другой тип объекта, и ваш код все равно будет работать.

Если мы покинем IoC из таблицы, вы можете написать код, который знает, что это может разговаривать с объектом , который делает что-то конкретное , но не тот тип объекта или как он это делает.

Это было бы полезно при передаче параметров.

Что касается вашего вопроса в скобках «Также, как вы могли написать метод, который принимает объект, реализующий интерфейс? Возможно ли это?», на C # вы просто используете тип интерфейса для типа параметра, например:

public void DoSomethingToAnObject(IInterface whatever) { ... }

Это подключается прямо к «разговору с объектом, который делает что-то конкретное». Метод, определенный выше, знает, чего ожидать от объекта, что он реализует все на IInterface, но ему не важно, какой тип объекта он есть, только тот, который он придерживается в контракте, что является интерфейсом.

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

Это красота интерфейсов. Вы можете написать фрагмент кода, который знает, что он получит переданные ему объекты, от которых он может ожидать определенного поведения. Ему не важно, какой именно объект он хочет, только потому, что он поддерживает требуемое поведение.

Позвольте мне привести конкретный пример.

У нас есть пользовательская система перевода окон. Эта система проходит через элементы управления в форме и преобразует текст в каждый. Система знает, как обрабатывать базовые элементы управления, такие как свойство type-of-of-control-that-a-Text-свойство и аналогичные базовые элементы, но для чего-то базового оно не подходит.

Теперь , поскольку элементы управления наследуют от заранее определенных классов, которые мы не контролируем, мы могли бы сделать одну из трех вещей:

  1. Построить поддержку нашей системы перевода, чтобы определить, какой тип управления он работает с помощью и перевести правильные биты (кошмар обслуживания)
  2. Построить поддержку в базовых классах (невозможно, поскольку все элементы управления наследуются от разных заранее определенных классов)
  3. Добавить поддержку интерфейса

Итак, мы сделали nr. 3. Все наши элементы управления реализуют ILocalizable, который является интерфейсом, который дает нам один метод, способность переводить «сам» в контейнер текста перевода / правил. Таким образом, форма не должна знать, какой вид управления она обнаружила, только то, что она реализует конкретный интерфейс, и знает, что существует метод, в котором он может вызвать локализацию элемента управления.

3
задан Baum mit Augen 8 October 2015 в 00:47
поделиться

1 ответ

даже при подавлении вы все равно получите ложные срабатывания в среде выполнения OpenMP, потому что в среде выполнения есть некоторый механизм синхронизации, который Tsan не может понять.

Мы работали над временем выполнения OpenMP, чтобы сделать Tsan понять эти точки синхронизации и удалить все ложные срабатывания.

Взгляните на этот проект:

https://github.com/PRUNER/archer

Дайте мне знать, если вам нужна дополнительная помощь.

Лучшее,

Simone

3
ответ дан Simone Atzeni 21 August 2018 в 06:50
поделиться
  • 1
    Спасибо, я проверю это, когда у меня появится такая возможность. Может быть немного, хотя я сейчас работаю над чем-то другим, а коллега делает вещи для дезинфицирующих средств. – Baum mit Augen 25 February 2016 в 19:50
Другие вопросы по тегам:

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