Вопрос. Как я могу убедиться, что мое приложение является потокобезопасным? Есть ли у них какие-либо общие практики, методы тестирования, вещи, которые нужно избегать, вещи, которые нужно искать?
Фон. В настоящее время я разрабатываю серверное приложение, которое выполняет ряд фоновых задач в разных потоках и общается с клиентами с помощью Indy (используя еще одну связку автоматически генерируемых потоков для связи). Поскольку приложение должно быть очень доступным, крах программы очень плохо, и я хочу убедиться, что приложение является потокобезопасным. Независимо от того, время от времени я обнаруживаю фрагмент кода, который генерирует исключение, которое никогда не происходило раньше, и в большинстве случаев я понимаю, что это какая-то ошибка синхронизации, когда я забыл синхронизировать мои объекты должным образом. Отсюда мой вопрос, касающийся лучших практик, тестирования безопасности потоков и тому подобного.
mghie: Спасибо за ответ! Я должен быть немного точнее. Чтобы быть ясным, я знаю принципы многопоточности, я использую синхронизацию (мониторы) во всей своей программе, и я знаю, как отличать проблемы потоковой передачи от других проблем с реализацией. Но, тем не менее, я постоянно забываю добавлять правильную синхронизацию время от времени. Чтобы привести пример, я использовал функцию сортировки RTL в своем коде. Посмотрел что-то вроде
FKeyList.Sort (CompareKeysFunc);
Оказывается, мне пришлось синхронизировать FKeyList во время сортировки. Это просто не пришло мне в голову, когда первоначально пишут эту простую строку кода. Это то, о чем я хочу поговорить. В каких местах можно легко забыть добавить код синхронизации? Как вы убедитесь, что вы добавили код синхронизации во всех важных местах?