2016-07-15 2 views
2

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

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

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

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

Актуальными является следующее:

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

Если вы хотите настоящую песочницу, вам нужно использовать отдельные процессы, как это реализовано в хроме. –

ответ

5

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

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

+0

Серьезно? Христос. Знаете ли вы о каких-то таких сценариях? – JesseTG