【问题标题】:Many detached boost threads segfault许多分离的提升线程段错误
【发布时间】:2014-01-10 02:38:31
【问题描述】:

我正在使用

的函数内创建增强线程
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&lt;uint64&gt; trueNonceQueue(128); 创建的。

这是线程化的函数

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

我注意到,在它崩溃后,我的交换量略有增长,除非我在内存泄漏后使用这种糟糕的技术,否则这种情况永远不会发生;否则,我的内存使用量经常保持在 2 gigs 以下。我在 ubuntu 桌面上运行 cinnamon,chrome 和其他一些小程序打开。运行时我没有使用计算机。

段错误发生在949900000th 迭代之后。如何纠正?


CheckNonce执行时间

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

如果分离的线程开始落后于产生的while,我会更新。

【问题讨论】:

  • 这段代码做什么是什么意思?
  • 您正在创建 949900000 个线程并想知道为什么您的程序会出现段错误?那不是很多线程,那是一门指向蚁丘的轨道大炮。每个线程都占用内存,它比进程更轻量级,但即便如此它也会有自己的堆栈空间等。
  • @JohnZwinck 感谢您关注 John Zwinck!它正在验证加密货币(不是比特币)块哈希以生成创世块。
  • @Zeta 也感谢您关注 Zeta! CheckNonce 函数只需极少的时间即可完成。
  • 所以你是说你创建了数百万个线程,而每个线程都需要很少的时间来完成?如果是这样,你做错了。您应该改用线程池,将线程创建和拆卸开销限制在一个小常数。

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


【解决方案1】:

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

Boost 中并不完全有一个线程池,但是您需要构建一个线程池。有关一些想法,请参见此处:boost::threadpool::pool vs.boost::thread_group

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

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

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

【讨论】:

  • 非常感谢约翰·兹温克!我正在使用thread_group,使用我所有的内核,它的哈希率是原来的 10 倍,我什至可以继续使用我的电脑!我以前是这样,但我的系统监视器显示所有内核的使用率为 100%。
猜你喜欢
  • 2016-10-27
  • 2012-05-16
  • 2015-09-11
  • 2019-05-15
  • 1970-01-01
  • 1970-01-01
  • 2012-01-08
  • 2015-06-09
相关资源
最近更新 更多