-1

多くのプログラミング言語では、 thread.In の実行を停止するために多くの問題が提起されています。stop()、stop(Throwable)、suspend()、destroy()、および resume() は、スレッドを開始および停止するための基本的な機能を提供することを目的としていましたが、廃止されました。単にスレッドから移動するために toを使用できますか?c/c++ gotoJavagoto

このようなもの:

//Thread block

{...
 if(some condition)
goto out;
.....
 ...
 }//thread block over

out:
// I am out!!
}

gotoを使用することは非常に悪い習慣であることは知っていますが、それでもこのように使用できますか?

アップデート:

または:

//Thread block

{...
 if(some condition)
goto out;
.....
 ...
 out:
 // I am out!!
 }//thread block over

コメントから、これは解決策ですか?

更新 2:

まあ、私はさまざまな種類の答えを得ています.いくつかのはい、いくつかのいいえ.私はc / c ++をあまり使用していません。そうでなければ、実装して自分自身を見ることができたでしょう。

4

6 に答える 6

7

これはうまくいきません。

  1. goto別の方法にはできません。
  2. スレッドはメソッドにバインドされておらず、1 つのメソッドを複数のスレッドで実行できます。

場所が同じメソッド内にある場合、ステートメントgotoを実行したスレッドの新しい場所で実行が続行されます。goto

あなたができることは、スレッドメソッドの最後に行くことです - 現在のコードがそのメソッドにある場合。これはスレッドを終了しませんがgoto、スレッド メソッドの終了直前にプログラム フローを移動し、スレッド メソッドの実行が終了してスレッドが終了します。これは、単純にスレッド メソッドから ing を実行する
のと同じ効果です。return

于 2013-01-08T13:47:10.183 に答える
2

絶対に、次のことができます: を使用gotoして、ほぼどこからでも無条件にメソッドの最後に制御を移すことができますが、ほとんど制限はありません。これがスレッドを実装するメソッドである場合、終了し、スレッドを終了します。

必要があるかどうかは別の問題です。ごくわずかな例外を除いgotoて、プログラムが読みにくくなります。例外なく、 なしでも同じ結果が得られgoto、同時に可読性が向上します。たとえばreturn、スレッドのロジックを実装するメソッドを終了するために使用できます。

于 2013-01-08T13:48:29.310 に答える
1

スレッド関数からラベルに移動できません

out:スレッド機能の最後に を設定できます。このようにして、スレッドを停止したい場合はgotoout:(スレッド関数の任意の場所から) スレッド関数を停止できます。

スレッドの最後でコードの一部を実行したい場合は、使用できますpthread_cond_signal(&cond);

次のリンクには、使用方法の例が含まれています

于 2013-01-08T13:51:35.827 に答える
1

goto を使用してスレッドから「移動」することはできません。スレッドの実行は特定のスコープに限定されず、コード内の別の場所に移動しただけでは終了しません。

于 2013-01-08T13:47:34.853 に答える
1

まず、クリーンアップ コードを関数の最後に置き、それにジャンプすることgotoは、C では非常に有効なパターンです。コードがよりクリーンで理解しやすくなる場合はいつでも使用してください。もちろん、これは悪用される可能性があり、複数レベルの関数がある場合はうまく機能しないため、クリーンアップ コードに移動できるようにするためだけに、あまりにも長い関数を作成することを助長する可能性があります。しかし、慎重に使用されている限りgoto、C では非常に有効です。また、質問が少し曖昧なので、これを明示的に言った方がよいでしょうgoto。関数間ではできません。また、例外をサポートする言語では、代わりにそれらを使用する必要がありgotoます (もちろん、それらも正しく使用する必要があり、悪用しないでください)。

gotoしかし、多くの場合、特にスレッドでは、スレッドのクリーンアップ ハンドラーを登録する方がよいため、コードのクリーンアップに使用する代わりに、スレッド フレームワークの「このスレッドを終了する」関数を返すか呼び出すことができます。

最後に、上記のコードでは、out:ラベルの後にコードがなくても、...returnを使用する代わりにgoto... これは、スレッド ライブラリを使用していることを前提としています。このライブラリは、関数を別のスレッドで実行し、その関数が戻ったときにスレッドを終了します。 .

于 2013-01-08T13:48:31.010 に答える
1

いいえ、できません。

しかし、おそらく必要はありません... ThreadAbortException を使用して (Thread.Abort() を呼び出して)、それをキャッチし (はい、スレッド内で)、「out」機能を実行して、Thread.ResetAbort を実行することができます。 . 注意して、別のスレッドから中止を呼び出すときにMSDNに関連するリスクを必ず読んでください(これは行っていないようです)。

参照: http://msdn.microsoft.com/en-us/library/ty8d3wta.aspx

于 2013-01-08T13:53:31.987 に答える