对于需要遍历每个节点的每个功能,如果您试图让它计算节点数量,那么顺序并不重要 - 我喜欢这样做它并行。
我遇到限制其创建的线程数的问题。基本结构如下:
volatile int threadLimit = 4, curThreads = 1;
mutex m;
void Tree::addThread() {
m.lock();
curThreads++;
m.unlock();
}
void Tree::killThread() {
m.lock();
curThreads--;
m.unlock();
}
Bool Tree::makeNewThread() {
m.lock();
Bool a = curThreads < threadLimit;
m.unlock();
return a;
}
编辑:
int Node::getCount() {
if (!left || !right || !Tree->makeNewThread())
irrelevant serial code
else
Tree->addThread();
future<int> lf = async([this] () {return left->getCount();});
int r = right->getCount();
int l = lf.get();
Tree->killThread();
return r + l + 1;
}
编辑(续):我想这样做的原因是因为它需要遍历每个节点。我使用的特定系统是红黑树的实验版本(我试图添加不同的接口方式),当前的压力测试显示它可以处理2,000,000多个节点(理论上可以到2 ^ 64)。如果它可以在几个线程中经历这些,那么我宁愿这样做。
出于某种原因,使用此检查方法将在我的AMD桌面上生成无限数量的线程,但在我的英特尔笔记本电脑上使用的数量有限。两者都在Windows 8.1(更新)上使用Visual Studios IDE和编译器,并且在32位和64位版本上的行为相同。
答案 0 :(得分:0)
您可以使用posix信号量http://linux.die.net/man/7/sem_overview
您可以将它们初始化为您想要的线程数。您可以在创建新线程之前使用sem_wait()来限制它们,并在线程终止后使用sem_post()以再次增加可用线程的数量。