使用标准库的试锁信号量



我正在构建一个Sokoban求解器。因为我正在做深度优先搜索(是的,这是一个可怕的想法,我知道),我希望做多线程。

函数是递归的。因此,我想要一个信号量(就像这里建议的那样),但我需要能够尝试锁定,并且在没有锁定能力的情况下,就像什么都没有发生一样继续进行。

信号量应该控制是否应该启动一个新线程。由于我正在使用递归函数,我可以想象,如果我只是实现链接的信号量并等待释放,那么开销会很大。

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

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

(当我完成了我想要的,我将尝试IDA*,所以只关注我想要实现的,而不是解决我解决Sokoban谜题的方法的潜在但巨大的问题:-))

所以你必须为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;
        }
    }
};

最新更新