【问题标题】:deleting pthread_t*删除 pthread_t*
【发布时间】:2012-10-28 12:44:12
【问题描述】:

我写了一个小的 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

【问题讨论】:

  • “我收到检测到 glib 的错误” - 成就了我的一天。
  • std::vector&lt;pthread_t&gt; threadNumber(4);
  • 添加到 Martinho 评论,std::vector&lt;std::thread&gt;threads(4);

标签: c++ pthreads


【解决方案1】:

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

不是这个:

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

但这是正确的:

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

您的版本是一个 pthread_t 变量,初始化为 4 - 无论 4 在此上下文中意味着什么 - 因为 pthread_t 是不透明类型。

所以,你应该用delete threadNumber删除错误的版本,用delete [] threadNumber删除正确的版本

【讨论】:

    【解决方案2】:

    我知道你有关于 pthread 的答案,但我认为你可能会感兴趣考虑以下内容。

     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 平台工作。

    但是,如果您尝试将单个问题拆分到多个线程中,您可能还想查看 Intel TBB 等库。

    参考

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

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-12-18
        • 2011-01-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-31
        相关资源
        最近更新 更多