我正在构建一个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;
}
}
};