我正在建立一个推箱子解算器。因为我正在进行深度优先搜索(是的,这是一个可怕的想法,我知道)我希望这样做多线程。
我的功能是递归的。因此,我想要一个信号量(就像建议的here),但我需要能够尝试锁定,如果没有锁定能力,那么就好像没有发生任何事情一样。
信号量应该控制是否应该启动新线程。由于我使用的是递归函数,我可以想象很多开销,我只是实现链接的信号量并等待释放。
SO:如何尝试锁定信号量,但如果没有更多信号量可用则跳过等待?或者是否有比信号量更好的解决方案?
我的构建链支持C ++ 14。我安装了Boost,但我想避开第三方库。我使用的是Ubuntu 14.04。
(当我完成了我想做的事情时,我会去IDA *,所以只关注我想要实现的目标而不是解决我解决Sokoban难题的方法所带来的潜在但巨大的问题: - ))
答案 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;
}
}
};