2016-07-15 3 views
2

私はC++ 11、Qt 5.6(すぐにV-Playがサポートするとすぐに5.7)、QMLでデスクトッププログラミングゲームを作っています。ユーザーはパズルを解決するための任意のコードを書くことができます。ただし、コードは完全にサンドボックス化されており、ではなく、はアプリケーションの残りの部分で問題を引き起こします。Qt/C++で確実にスレッドを削除するには?

私はその環境を完全に制御し、それを通してプレーヤーのコードを実行するスクリプトエンジンをインスタンス化します。私は、エンジンに依存するソリューションを望んでいないので(私は複数の言語をサポートするかもしれません)、どのスクリプトエンジンがいいのかは言いません。プレイヤーが「Submit」を押すと、スクリプトを非同期で実行するので、残りのゲームはまだ応答します。

ここに私の問題があります:プレーヤーのコードが実行に時間がかかる場合はどうなりますか?それとも無限ループなのか?プレイヤーとなるので、間違いを犯すことがありますので、「それはしないでください」はではなく、ここで有効な回答です。

だから、私はちょうどプレイヤーにコードを無条件で終了させるだろう。 しかし、未定義の動作、メモリリーク、クラッシュ、またはゲームに悪影響を与える可能性のある他のものを危険にさらすことなく、どうすればいいですか?関連性の

次のとおりです。

  • ソリューションは、マルチプラットフォームである必要があります。
  • 解決策はではありません。は、私が使用しているスクリプトエンジンによって異なります。
  • 私はスレッド間でデータを渡していないので、データ競合を心配する必要はありません。
  • QtConcurrent::runを返しません。をサポートQFuture::cancelです。
+0

本当のサンドボックス化が必要な場合は、chromiumで実装されているような別々のプロセスを使用する必要があります。 –

答えて

5

C/C++スレッドを安全に削除することはできません。何らかの意味のある作業を行っているスレッドは、作業を行うためにロックを取得したり、メモリを割り当てる必要があります。スレッドを強制終了すると、ロックが永久に保持されるか、メモリが割り当て解除される可能性があります。詳細によっては、多くのスクリプトが終了した後にアプリケーションがメモリ不足になる可能性があります。また、主スレッドが、終了したインタープリタスレッドが保持するロックを取得しようとすると、アプリケーションが完全にロックされる可能性があります。

実行中のスクリプトを中断できる必要がある場合は、特にこれを可能にするスクリプトエンジンを選択する必要があります。すべてではありません。それをサポートしていないものは避ける必要があります。

+0

真剣に?キリスト。あなたはそのようなスクリプトエンジンを知っていますか? – JesseTG

関連する問題