3

でブロックしているスレッド (thread1) がありsem_wait()、別のスレッド (thread2) が を使用してそのセマフォを破壊してsem_destroy()いる場合、thread1 はどうなりますか?

インターネットで簡単に検索すると、未定義の動作が発生することがわかります。

他のプロセスまたはスレッドが現在 (sem_wait(3) で) ブロックされているセマフォを破棄すると、未定義の動作が発生します。

しかし、たまたまこれが多くのマルチスレッド C++ アプリケーションで使用されているのを見ました。

私の主な質問:

  • これには何か目的があるのでしょうか?
  • 彼らは何を達成しようとしていましたか (たとえば、暗黙的にスレッドを終了させますか)?
  • それは非常に危険なことではありませんか?
4

2 に答える 2

3

使用中の何かを破壊することが正気であるか定義されているということを聞いたことがあるAPIの1つのケースを考えることはできません。だから私の意見では、あなたの質問に対する答えは次のとおりです。

では、彼らは何を達成しようとしていたのでしょうか。

知らない。

それは非常に危険ではないでしょうか?

はい!

たぶん、あなたが見た他のプログラムの作者は、実装が実際に何をしているのかを知っていて、それに依存しています。しかし、彼らはそれが将来変わる可能性に備えなければなりません。おそらく彼らは、そのような変更がプログラムを壊すリスクと、近道を取り、未定義の振る舞いに依存することによって達成した節約とを比較検討し、それが価値があると判断したのかもしれません。あなたはあなた自身のためにその判断をしなければなりません。

于 2012-12-28T23:08:20.423 に答える