0

小さな pthread マルチスレッド プログラミングを書き、作成した pthred_t 配列をクリーンアップしたいと考えました。しかし、それを行うと、glib が検出されたというエラーが表示されます。アレイを削除するにはどうすればよいですか、それとも単に必要ないのでしょうか。コードはメモリを解放しなくても正常に実行されますが、私の意見では、以下のコードは (小さな) メモリ リークを引き起こします。ありがとう

pthread_t* threadNumber = new pthread_t (4);
args var;
var.matrixA=matrixA;
var.matrixB=matrixB;
var.matrixC=matrixC;
var.alpha=alpha;
var.beta=beta;
var.cellCount=0;
var.maxCells=cColumns*cRows;

for (int i =0 ;i<4;++i)
  pthread_create(&threadNumber[i],&attr,matrixMultiply,(void *) (&var));

for(int i=0;i<4;++i)
  pthread_join(threadNumber[i],NULL);

printMatrix(matrixA,aRows,aColumns);
printMatrix(matrixB,bRows,bColumns);
printMatrix(matrixC,cRows,cColumns);

//delete threadNumber;
//this caused a memory trash
4

3 に答える 3

4

配列を作成するには角括弧が必要です:

これではない:

pthread_t* threadNumber = new pthread_t (4);
//                                      ^ ^

しかし、これは正しいです:

pthread_t* threadNumber = new pthread_t [4];
//                                      ^ ^

あなたのバージョンは、 pthread_t が不透明なタイプであるため、4初期化された 1 つの pthread_t 変数です。4

したがって、間違ったバージョンでは で削除しdelete threadNumber、正しいバージョンでは削除する必要がありますdelete [] threadNumber

于 2012-10-28T12:47:16.437 に答える
4

pthreads についての回答があることは承知していますが、次のことを検討することは興味深いことだと思います。

 std::vector<std::thread> threads;

 for(int i=0; i!=4; ++i) threads.emplace_back(&my_function, args);

 for(auto& th : threads) th.join();

POSIX プラットフォームでのみ動作する pthread とは異なり、手動でクリーンアップする必要はなく、準拠しているコンパイラ間で移植可能です。

ただし、1 つの問題を多くのスレッドに分割しようとしている場合は、Intel TBB などのライブラリも参照することをお勧めします。

参考文献

http://en.cppreference.com/w/cpp/thread/thread

http://en.cppreference.com/w/cpp/container/vector

注意: コンパイラが C++11 をサポートしていない場合 (サポートしている可能性があります)、boost には、非常によく似たインターフェイスと機能を持つ boost::thread があります。

于 2012-10-28T12:56:01.277 に答える
0

delete[] threadNumber;配列を削除するときに使用します。

于 2012-10-28T12:46:27.180 に答える