3

クライアントから送信されたデータをエコー バックするマルチスレッド サーバープログラムを作成しています。クライアントごとに 1 つのスレッドを生成しています。スレッドの開始ルーチン内で、クライアントのデータを受信して​​エコー バックしています。

クライアントが切断された場合は、 を使用してそのスレッドをデタッチ済みとして設定しているpthread_detach(pthread_self())ため、終了時にスレッドのストレージをhereのように再利用できます。

だから私はこれを尋ねたかった: 1) スレッドを単独
でデタッチするのは正しいですか? 2) プログラムのどこかでスレッドを (それ自体で) 切り離されたものとして設定するのは正しいですか? つまり、スレッドの作成直後または作成時にそうする必要はありませんか?

PS: 私のプログラムは正常に動作していますが、マルチスレッド プログラムでは、エラーがあっても最初は表示されない可能性があるため、この 2 つの問題を解決したかったのです。

4

3 に答える 3

1

スレッドが自分自身をデタッチすることが正しいかどうかは、プログラムのリソース所有権に関する契約の問題です。類推が必要な場合は、pthread_detachによって取得されたポインタpthread_joinpthread_tのそのまま、またはファイル記述子へのそのままです。したがって、スレッド呼び出し自体を持つことは、オブジェクトに対するオブジェクト呼び出しのメソッドとして動作する関数を持つこととよく似ています。本質的に間違っているわけではありませんが、慣用的ではなく、発信者を混乱させる可能性があります。少なくとも、呼び出し元がスレッドで使用できないコードのインターフェイスの一部としてドキュメント化する必要があります。また、スレッドの作業がいつ終了するかを判断するメカニズムが呼び出し元に必要な場合は、別のメカニズムを提供する必要があります。freemallocclosepthread_detachfreepthread_join

于 2013-08-23T12:42:50.010 に答える
1

スレッドを切り離すこと自体は問題ありませんが、スレッドが正しく切り離され、スレッドが切り離された後に誰もアクセスできないように注意する必要があります。オブジェクトスレッドの取得を破棄しthread::idて、変数が保持されないようにし、スレッドが切り離された後、他の実行中のスレッドがそれにアクセスできないようにします。通常は糸自体を外すのが良い

于 2013-08-23T11:01:10.270 に答える