2017-07-26 15 views
0

コンテキスト:

Unityコルーチンは、Articleに従ってマルチスレッド化されていません。したがって、コルーチンコールバックがグローバル変数にアクセスしている場合は、スレッドの競合がないと想定します。コルーチンコールバックはスレッドセーフですか?

例:

//Declaration 
private IEnumerator Resolve(WWW request, Action<WWW> callback) 
{ 
    while (!request.isDone) 
    { 
     yield return null; 
    } 

    callback(request); 
} 

//Invocation - called constantly 
StartCoroutine(Resolve(request, request => {GlobalVar = request.text;})); 

できコルーチンが実際に同期しているかGlobalVarは、スレッドセーフであるこの確認を経験した人?

+2

すべては定義スレッドセーフで、あなただけの1スレッドとスレッドの競合を持つことはできませんされ遭遇することはできません。 – Felype

+0

https://docs.unity3d.com/uploads/Main/monobehaviour_flowchart.svgの-Game Logic-セクションを確認してください。 Coroutinesとyieldには、Game Loopsで呼び出される特定の時間があります。[Gameループは常に単一のスレッドです。私はそれに例外がないことを知っている] –

答えて

1

私はこのことについて最近コメントしています。

これらのコメントは現在見つかりませんが、Found itです。

いいえ、コルーチンはnot threadsであり、同期している競合状態

+0

「競合状態」が不可能であることはわかりません。 yieldにインタリーブコールがある場合は、共有データの状態が変わる可能性があります。ユニティのコルーチンでは、協調的なマルチタスキングであり、したがって、先取りがないと言う方がより正確かもしれません。マルチタスキングの問題のほとんどは、依然として適用されています。再入可能、デッドロック、およびTOCTOU条件です。 – Mitch

+0

@Mitch私は思っているあらゆる方法でそれをテストしました。予期しない順序でデータが変更されることはありませんでした。私はいくつかの選択肢を試してみてうれしい。 – Draco18s

+0

共有状態にアクセスし、変更して元の状態に戻す2つの呼び出しを考えてみましょう。 'doWork(); var prevBackgroundColor = this.BackgroundColor; this.BackgroundColor = Colors.Red;仕事する();産出(); this.BackgroundColor = prevBackgroundColor; '。 'BackgroundColor'は' prevBackgroundColor'で取り込まれた共有状態のために赤色になってしまうことがあります。 – Mitch

関連する問題