Задайте прерывания Preemptable и задачи Nonpreemptable

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

Эмуляция приоритетов задач

Можно задать до четырех различных приоритетов с этими опциями (с самым высоким приоритетом, перечисленным сначала):

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

Примеры приоритетов задач

Рассмотрите этот пример с тремя задачами. Переменная var совместно используется этими двумя задачами task1 и task2 без любой защиты, такими как критический раздел. В зависимости от приоритетов task1 и task2, Средство поиска Ошибки показывает гонку данных. Третья задача не важна для примера (и добавляется только, чтобы включать критический раздел, в противном случае обнаружение гонки данных отключено).

int var;

void begin_critical_section(void);
void end_critical_section(void);

void task1(void)  { 
    var++;
}

void task2(void)  { 
    var=0;
}

void task3(void){
    begin_critical_section();
    /* Some atomic operation */
    end_critical_section();
}

Настройте приоритеты task1 и task2 и смотрите, обнаруживается ли гонка данных. Например:

  1. Сконфигурируйте эти mulitasking опции:

  2. Запустите средство поиска ошибки.

    Вы не видите, что данные мчатся. Поскольку task1 и task2 являются nonpreemptable прерываниями, к совместно используемой переменной нельзя получить доступ одновременно.

  3. Измените task1 на выгружаемое прерывание при помощи опции -preemptable-interrupts.

  4. Запустите Средство поиска Ошибки снова. Вы теперь видите, что данные мчатся на совместно используемой переменной var.

Дальнейшие исследования

Измените этот пример следующими способами и смотрите эффект модификации:

  • Измените приоритеты task1 и task2.

    Например, можно оставить task1 как nonpreemptable прерывание, но изменить task2 на выгружаемое прерывание при помощи опции -preemptable-interrupts.

    Гонка данных исчезает. Причина:

    • task1 имеет более высокий приоритет и не может быть прерван task2.

    • Операция в task2 является атомарной и не может быть прервана task1.

  • Включите средству проверки Data race including atomic operations (не включенный по умолчанию). Используйте опцию Find defects (-checkers).

    Вы видите, что данные мчатся снова. Средство проверки рассматривает все операции как потенциально неатомарные, и операция в task2 может теперь быть прервана более высокой приоритетной операцией в task1.

Попробуйте другие модификации к аналитическим опциям и смотрите результат средств проверки.

Смотрите также

Аналитические опции Polyspace

Результаты Polyspace

Похожие темы