none
マルチスレッドからのリダイレクトについて RRS feed

  • 質問

  • 環境はVisual C++ 6.0です。

    _beginthreadex()で幾つかスレッドを作成して,そのスレッド内でdup(),dup2()で,スレッド毎にファイル名を変えて,標準出力をファイルに書き出すように切り替えた状態で,そのスレッドから呼び出された関数の標準出力をリダイレクトする機能を実現したいのですが,dupの標準出力の切り替えがプロセス全体に行っているようで,毎回違うファイルに書き出されたりします。

     UNIX環境でも同様の機能を作成したのですが,その場合はマルチスレッドライブラリの場合にdup関数がスレッドセーフな関数にアセンブリされ実行されるため,各スレッド毎に指定したファイルにスレッド配下から呼び出された関数の出力が期待通りリダイレクトされているようです。

     VCでdupのスレッドセーフ版な関数があるか,ビルド時にうまい事できるのかを調べているのですが,今のところ分かっていない状況です。何か手がかりをお知りの方はご教授お願いします。

     

     

     

     

    2008年12月17日 7:35

回答

  •  あびぽ さんからの引用

     VCでdupのスレッドセーフ版な関数があるか,ビルド時にうまい事できるのかを調べているのですが,今のところ分かっていない状況です。何か手がかりをお知りの方はご教授お願いします。

     

    dupをどうという話ではないのですが、「ファイルに書き出すためだけのwriter thread」を用意して、そちらに全部任せてしまうというのは如何でしょうか?

     

    2008年12月18日 1:31

すべての返信

  •  あびぽ さんからの引用

     VCでdupのスレッドセーフ版な関数があるか,ビルド時にうまい事できるのかを調べているのですが,今のところ分かっていない状況です。何か手がかりをお知りの方はご教授お願いします。

     

    dupをどうという話ではないのですが、「ファイルに書き出すためだけのwriter thread」を用意して、そちらに全部任せてしまうというのは如何でしょうか?

     

    2008年12月18日 1:31
  • dupはプロセス全体に影響するみたいなんで,スレッド固有データを利用して、

    ディスクリプタだけ渡すことにしました。

    writer threadとはあまりピンと来ないですが,多分似たような事をしていると思います。w

    ご回答ありがとう御座いました。

    2008年12月19日 16:16
  • こんにちは。中川俊輔 です。

     

    Takashi SAKAMOTOさん、回答ありがとうございます。

     

    あびぽさん、フォーラムのご利用ありがとうございます。

    あびぽさんの解決方法とは違うようですが、

    有用な情報と思われたため、Takashi SAKAMOTOさんの回答へ回答済みチェックをつけさせていただきました。

     

    今後ともフォーラムをよろしくお願いします。

    それでは!

    2009年1月5日 7:32