许多分离的提升线程段错误

时间:2013-12-21 08:28:12

标签: c++ segmentation-fault boost-thread detach swapfile

我正在使用

在函数内创建boost线程
while(trueNonceQueue.empty() && block.nNonce < std::numeric_limits<uint64_t>::max()){
    if ( block.nNonce % 100000 == 0 )
    {
        cout << block.nNonce << endl;
    }
    boost::thread t(CheckNonce, block);
    t.detach();
    block.nNonce++;
}
uint64 trueNonce;
while (trueNonceQueue.pop(trueNonce))
        block.nNonce = trueNonce;

trueNonceQueue是在全局范围内使用boost::lockfree::queue<uint64> trueNonceQueue(128);创建的。

这是有线程的函数

void CheckNonce(CBlock block){
    if(block.CheckBlockSilently()){
        while (!trueNonceQueue.push(block.nNonce))
            ;
    }
}

我注意到它崩溃后,我的交换量略有增长,这种情况从未发生过,除非我在泄漏记忆后使用这样糟糕的技术;否则,我的内存使用率经常低于2演出。我正在使用chrome和其他一些小程序打开ubuntu桌面上运行肉桂。我在运行时没有使用电脑。

在第949900000次迭代后发生了段错误。如何纠正?


CheckNonce执行时间

我向CheckNonce添加了相同的模数,看看是否有任何滞后。到目前为止,没有。

如果分离的线程开始落后于产生while

,我将更新

1 个答案:

答案 0 :(得分:1)

您应该使用线程池。这意味着产生足够的线程来完成工作而不会产生不适当的争用(例如,您可能会在N核机器上产生类似N-2线程的东西,但如果某些工作可能会阻塞I / O,则可能更多)。

Boost中没有完全一个线程池,但是你需要构建一个线程池。请参阅此处了解一些建议:boost::threadpool::pool vs.boost::thread_group

或者你可以使用这样一个更现成的解决方案(虽然它有点过时,可能没有维护,不确定):http://threadpool.sourceforge.net/

然后想法产生N个线程,然后在你的循环中为每个任务,只需将任务“发布”到线程池,下一个可用的工作线程将在那里拾取它。

通过这样做,您将避免许多问题,例如耗尽线程堆栈空间,避免低效的资源争用(查找“雷鸣般的群体问题”),并且您将能够轻松调整您的攻击性在任何系统上使用多个核心。