如何限制二叉树创建的线程数?

时间:2015-04-13 15:14:48

标签: c++ multithreading c++11

对于需要遍历每个节点的每个功能,如果您试图让它计算节点数量,那么顺序并不重要 - 我喜欢这样做它并行。

我遇到限制其创建的线程数的问题。基本结构如下:

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位版本上的行为相同。

1 个答案:

答案 0 :(得分:0)

您可以使用posix信号量http://linux.die.net/man/7/sem_overview

您可以将它们初始化为您想要的线程数。您可以在创建新线程之前使用sem_wait()来限制它们,并在线程终止后使用sem_post()以再次增加可用线程的数量。