многопоточность — Как надежно убить поток в Qt / C ++?

Я делаю настольную игру для программирования на C ++ 11, Qt 5.6 (скоро 5.7, как только V-Play его поддержит) и QML. Пользователь сможет написать произвольный код для решения головоломок; тем не менее, код должен быть полностью изолирован не вызвать проблемы с остальной частью приложения.

Поэтому я создаю скрипт-движок, среду которого я полностью контролирую, и запускаю код игрока через него. Я не буду говорить, что такое движок сценариев, потому что я не хочу, чтобы решение опиралось на движок (плюс, я могу поддерживать несколько языков). Когда игрок нажимает «Отправить», я запускаю скрипт асинхронно, так что остальная часть игры по-прежнему реагирует.

Но вот моя проблема: Что произойдет, если код игрока занимает много времени для запуска? Или еще хуже, что если это бесконечный цикл? Игрок будут делать ошибки, когда они учатся, поэтому «они не должны этого делать» не правильный ответ здесь.

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

Уместно следующее:

  • Решение должно быть мультиплатформенным.
  • Решение должно не зависит от того, какой скриптовый движок я использую.
  • Я не передаю данные между потоками, поэтому мне не нужно беспокоиться о гонках данных.
  • QFutureс этим QtConcurrent::run возвращается не делайте служба поддержки QFuture::cancel,

2

Решение

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

Если вам нужно прервать выполнение сценариев, вам нужно будет выбрать механизмы сценариев, которые специально это допускают. Не все будут; вам нужно будет избегать тех, кто его не поддерживает.

5

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]