0

MacOS と Linux で正常に動作し、mingw を使用して Windows にクロスコンパイルするプログラムがあります。最近、プログラムをマルチスレッド化しました。

プログラムの現在の設計では、メモリがメイン スレッドに割り当てられ、スレーブの「ワーカー」スレッドで解放されます。malloc/free システムはマルチスレッドであるため、MacOS と Linux では問題ありません。

ただし、クロスコンパイルが心配です。私が使用しているmingwのバージョンは、MacOSポートから構築されています。これは 2004 年からのかなり古いバージョンの G++ (バージョン 3.4.5) です。より新しいバージョンをビルドしようとして失敗しました (64 ビット バージョンをビルドしたいのですが、あきらめました)。http://sourceware.org/pthreads-win32から pthread を取得しています。

私の懸念は、3.4.5 の malloc & free システムがマルチスレッド化されていないことです。

質問:

  1. 解放されるメモリのブロックがメインスレッドに戻されて解放されるように、プログラムを書き直す必要がありますか?

  2. 最新の mingw にアップグレードする必要がありますか?

  3. 大量のテスト以外に、これらの並行性の問題を見つける方法はありますか? それは私には気分が悪いだけです。

ありがとう!

4

2 に答える 2

1

malloc と free がマルチスレッド化されていないのはなぜですか?

mingw32 はデフォルトで、マルチスレッド DLL である msvcrt.dll とリンクします。[1] を参照してください。[2] Microsoftが提供するシングルスレッド ライブラリがありましたが、静的リンクでしか利用できませんでした。

PS: クロスコンパイルしているとのことですが、代わりに Windows プログラムを Windows でコンパイルしているようです。そんな時はwww.mingw.orgからバイナリをダウンロードしてみてはいかがでしょうか?(ただし、必要なファイルをダウンロードで把握するのは面倒です)

1- http://msdn.microsoft.com/en-us/library/abx4dbyh%28v=VS.71%29.aspx

2- [1] を参照してください。Visual Studio 2005 では削除されました http://msdn.microsoft.com/en-us/library/abx4dbyh%28v=VS.80%29.aspx

于 2011-01-13T13:28:37.630 に答える
1
  1. 私はこれを避けます。主な問題を回避しようとしているようです。
  2. はい、いずれにせよそれは良い考えです...
  3. メモリの割り当て/割り当て解除に関連する同時実行の問題を検出する 1 つの方法は、メモリ リーク検出器です。valgrind が cygwin で動作するかどうかはわかりません。
于 2010-11-27T01:14:05.930 に答える