使用标准库

时间:2015-09-29 21:24:19

标签: c++ multithreading

我正在建立一个推箱子解算器。因为我正在进行深度优先搜索(是的,这是一个可怕的想法,我知道)我希望这样做多线程。

我的功能是递归的。因此,我想要一个信号量(就像建议的here),但我需要能够尝试锁定,如果没有锁定能力,那么就好像没有发生任何事情一样。

信号量应该控制是否应该启动新线程。由于我使用的是递归函数,我可以想象很多开销,我只是实现链接的信号量并等待释放。

SO:如何尝试锁定信号量,但如果没有更多信号量可用则跳过等待?或者是否有比信号量更好的解决方案?

我的构建链支持C ++ 14。我安装了Boost,但我想避开第三方库。我使用的是Ubuntu 14.04。

(当我完成了我想做的事情时,我会去IDA *,所以只关注我想要实现的目标而不是解决我解决Sokoban难题的方法所带来的潜在但巨大的问题: - ))

1 个答案:

答案 0 :(得分:2)

因此,您必须向semaphore类(try

添加新方法
// Boost is needed no more
#include <condition_variable>
#include <mutex>

using namespace std;

class semaphore
{
private:
    mutex mutex_;
    condition_variable condition_;
    unsigned long count_;

public:
    semaphore()
        : count_()
    {}

    void notify()
    {
        unique_lock<mutex> lock(mutex_);
        ++count_;
        condition_.notify_one();
    }

    void wait()
    {
        unique_lock<mutex> lock(mutex_);
        while(!count_)
            condition_.wait(lock);
        --count_;
    }

    bool try()
    {
        unique_lock<mutex> lock(mutex_);

        if (count_)
        {
            --count_;
            return true;
        }
        else
        {
            return false;
        }
    }
};