【发布时间】: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<uint64> 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