Как я могу проверить алгоритмы без блокировок?

В теории это должно быть возможно, по крайней мере, к грубой силе проверка алгоритма без блокировок (существует только столько комбинаций пересечения вызовов функции). Есть ли какие-либо инструменты, или формальное обоснование обрабатывает доступный, чтобы на самом деле доказать, что алгоритм без блокировок корректен (идеально, это должно также быть в состоянии проверить на условия состязания и проблему ABA также)?

Примечание: Если Вы знаете способ просто подтвердить одну точку зрения (например, только доказать, что это безопасно от проблемы ABA), или проблема, которую я не упомянул, тогда отправляют решение так или иначе. В худшем варианте развития событий каждый метод может быть сделан в свою очередь, чтобы полностью проверить его.

25
задан Grant Peters 15 January 2010 в 13:43
поделиться

4 ответа

Вы можете использовать Google для таких терминов, как

  • автоматическая компоновка графика; и
  • алгоритмы на основе силы.

GraphViz реализует некоторые из этих алгоритмов, не будучи уверенным, включает ли он какие-либо полезные для вас.

Одно предостережение - для некоторых алгоритмов небольшие изменения содержимого графа могут привести к очень большим изменениям графа.

-121--5044794-

Если вам нужна более короткая, простая книга OpenGL, которая охватывает только программируемый конвейер, я выхожу на конечность и рекомендую OpenGL ES 2.0 Programming Guide . OpenGL ES 2 является подмножеством OpenGL, чтобы упростить его для встраиваемых систем. В большинстве ситуаций, когда в OpenGL существует более одного способа сделать что-либо, стандарт OpenGL ES включает только один способ. Версия 2 OpenGL ES предназначена для программируемого аппаратного обеспечения и поэтому включает только программируемый конвейерный материал. Поскольку OpenGL ES является подмножеством OpenGL, всё в OpenGL ES будет работать над реализацией OpenGL. В то время как «OpenGL Programming Guide» имеет длину 936 страниц, «OpenGL ES 2.0 Programming Guide» имеет длину всего 480 страниц.

-121--4716556-

Вы определенно должны попробовать Spin model checker .

Вы пишете программоподобную модель на простом C-образном языке под названием Promela, который Спин внутренне переводит в конечный автомат. Модель может содержать несколько параллельных процессов.

Затем Spin проверяет каждое возможное перемежение команд из каждого процесса для любых условий, которые вы хотите проверить - как правило, отсутствие расовых условий, свобода от взаимоблокировок и т.д. Большинство этих тестов можно легко записать с помощью операторов assert () . При наличии какой-либо возможной последовательности выполнения, нарушающей утверждение, последовательность распечатывается, в противном случае даётся «all-clear».

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

Это невероятная программа, она выиграла 2001 ACM System Программного обеспечения Award (другие победители включают Unix, Postscript, Apache, TeX). Я начал использовать его очень быстро, и за пару дней смог реализовать модели функций MPI MPI _ Isend () и MPI _ Irecv () в Promela. Спин обнаружил пару сложных условий гонки в одном сегменте параллельного кода, который я преобразовал в Promela для тестирования.

21
ответ дан 28 November 2019 в 21:13
поделиться

Используйте

static <T extends Comparable<? super T>> sort(T[] array);

, который является наиболее общей спецификацией для выполнения задачи. В основном, он утверждает, что T является типом, который можно сравнить с самим собой.

-121--266688-

Можно ли назвать ваше предложение Вариант A .

  1. Возьмите код сообщества VB6 , который создает библиотеку DLL для работы с крючками Windows.
  2. Перевести это в C #

Могу ли я предложить вариант B и вариант C, которые, я думаю, будут проще?

Вариант B
1. Начните с кода Microsoft C # для работы с зацепами Windows.
2. При необходимости адаптируйте его, просматривая, что API называет код VB6 делает .

Опция C
1. Возьмите встроенную библиотеку DLL VB6 из кода сообщества .
2. Вызовите эту DLL из нового приложения C # через Interop .

-121--4196144-

Обнаружение гонки данных является трудной проблемой NP [Netzer & Miller 1990]

Я слышал об инструментах Lockset и DJit + (они преподают его в курсе CDP). Попробуйте прочитать слайды и погуглить, на что они ссылаются. В нем содержится интересная информация.

4
ответ дан 28 November 2019 в 21:13
поделиться

Я не знаю Какую платформу или язык, который вы используете - но на платформе .NET существует проект исследований Microsoft Chess , который выглядит очень многообещающему, помогая тем из нас, выполняющих многопоточные компоненты - в том числе блокировку.

Я не использовал его огромное количество, разум.

Это работает (неочищенное объяснение), явно прословляя резьбы в самых трудных возможных способах фактически заставить ваши ошибки в дикой природе. Он также анализирует код, чтобы найти общие ошибки и плохие паттерны - аналогично анализу кода.

В прошлом я также построил специальные версии рассматриваемого кода (через блоки #if и т. Д.), которые добавляют дополнительную информацию о состоянии отслеживания состояния; Считается, версии и т. Д. То, что я могу погрузиться в тест на единицу.

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

4
ответ дан 28 November 2019 в 21:13
поделиться

Вы все еще «просматриваете» свои строки, будь то в таблице или в представлении строк таблицы.

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

-121--3690509-

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

Однако не каждый запрос позволяет индексировать представление по нему.

Если данные не являются фактическими со второго по второй, то создается таблица OK .

-121--3690508-

Спин действительно превосходен, но также рассмотрим Детектор реляций Дмитрия Вьюкова. Он предназначен для проверки параллельных алгоритмов, включая неблокирующие (без блокировки/ожидания) алгоритмы. Это открытый исходный код и либеральная лицензия.

Relacy предоставляет примитивы синхронизации POSIX и Windows (мутексы, переменные условий, семафоры, CriticalSections, события win32, блокированные * и т.д.), поэтому фактическая реализация C++ может быть передана в Relacy для проверки. Не нужно разрабатывать отдельную модель вашего алгоритма, как с Promela и Spin.

Relacy предоставляет C++ 0x std:: atomic (явное упорядочение памяти для выигрыша!), чтобы можно было использовать предпроцессор # defines для выбора между реализацией Relacy и собственной реализацией atomic ( tbb:: atomic , boost:: atomic и т. д.).

Планирование управляется: доступен случайный, контекстный и полный поиск (все возможные перемежения).

Вот пример программы Relacy. Несколько моментов:

  • $ - это макрос Relacy, записывающий информацию о выполнении.
  • rl:: var < T > помечает «нормальные» (неатомные) переменные, которые также должны рассматриваться как часть проверки.

Код:

#include <relacy/relacy_std.hpp>

// template parameter '2' is number of threads
struct race_test : rl::test_suite<race_test, 2>
{
    std::atomic<int> a;
    rl::var<int> x;

    // executed in single thread before main thread function
    void before()
    {
        a($) = 0;
        x($) = 0;
    }

    // main thread function
    void thread(unsigned thread_index)
    {
        if (0 == thread_index)
        {
            x($) = 1;
            a($).store(1, rl::memory_order_relaxed);
        }
        else
        {
            if (1 == a($).load(rl::memory_order_relaxed))
                x($) = 2;
        }
    }

    // executed in single thread after main thread function
    void after()
    {
    }

    // executed in single thread after every 'visible' action in main threads
    // disallowed to modify any state
    void invariant()
    {
    }
};

int main()
{
    rl::simulate<race_test>();
}

Компилируйте с помощью обычного компилятора (Relacy - это только заголовок) и запустите исполняемый файл:

struct race_test
DATA RACE
iteration: 8

execution history:
[0] 0:  atomic store, value=0, (prev value=0), order=seq_cst, in race_test::before, test.cpp(14)
[1] 0:  store, value=0, in race_test::before, test.cpp(15)
[2] 0:  store, value=1, in race_test::thread, test.cpp(23)
[3] 0:  atomic store, value=1, (prev value=0), order=relaxed, in race_test::thread, test.cpp(24)
[4] 1:  atomic load, value=1, order=relaxed, in race_test::thread, test.cpp(28)
[5] 1:  store, value=0, in race_test::thread, test.cpp(29)
[6] 1: data race detected, in race_test::thread, test.cpp(29)

thread 0:
[0] 0:  atomic store, value=0, (prev value=0), order=seq_cst, in race_test::before, test.cpp(14)
[1] 0:  store, value=0, in race_test::before, test.cpp(15)
[2] 0:  store, value=1, in race_test::thread, test.cpp(23)
[3] 0:  atomic store, value=1, (prev value=0), order=relaxed, in race_test::thread, test.cpp(24)

thread 1:
[4] 1:  atomic load, value=1, order=relaxed, in race_test::thread, test.cpp(28)
[5] 1:  store, value=0, in race_test::thread, test.cpp(29)
[6] 1: data race detected, in race_test::thread, test.cpp(29)

Последние версии Relacy также предоставляют модели памяти Java и CLI, если вы занимаетесь этим.

8
ответ дан 28 November 2019 в 21:13
поделиться
Другие вопросы по тегам:

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