删除pthread_t *

时间:2012-10-28 12:44:13

标签: c++ pthreads

我写了一个小的pthread多线程编程,我想清理我创建的pthred_t数组。但是当我这样做时,我得到一个错误,即检测到了一个滑动。如何删除阵列,或者我根本不需要。代码运行良好,没有释放内存,但在我看来,下面的代码导致(小)内存韭菜。 感谢

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

3 个答案:

答案 0 :(得分:4)

你需要方括号来创建数组:

不是这个:

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

但这是正确的:

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

您的版本是一个初始化为4的pthread_t变量 - 无论此4在此上下文中是什么意思 - 因为pthread_t是opaque类型。

因此,如果您的版本错误,则应使用delete threadNumber删除,使用delete [] threadNumber正确删除版本

答案 1 :(得分: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();

不需要手动清理,并且可以在任何兼容的编译器上移植,而pthread只能在POSIX平台上运行。

但是,如果您尝试在多个线程中分割单个问题,您可能还想查看像英特尔TBB这样的库。

引用

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

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

N.b:如果你的编译器不支持C ++ 11(它可能会这样做),那么boost有boost :: thread,它具有非常相似的接口和功能。

答案 2 :(得分:0)

删除数组时使用delete[] threadNumber;