我正在开发一个线程池,并一直在尝试找出处理线程安全的最佳方法。我想知道我的互斥锁用法是否“正确”,如果不是我应该如何更改它。我使用的是c ++ 11 std::thread
和std::mutex
。
这是Worker Threads函数。它锁定在第一行。
void Worker::work(void){
std::lock_guard<std::mutex> mutex(_lock);
while (_working) {
while (!_tasks.empty()) {
Job_t* job = _tasks.front();
if (!job->Complete()) {//the same job cannot be scheduled twice. It must be finnished before it is scheduled again.
(*job)();
}
_tasks.pop();
}
}
}
这是我的Job
类函数,它可以执行创建作业所需的任何“工作”。
void operator()(void){
_returnValue = func(_args,sequence_generator::gen_seq<sizeof...(arguments)>{});
}
template <typename... Args, int... Is>
returnType func(std::tuple<Args...>& tup, sequence_generator::_index<Is...>)
{
std::lock_guard<std::mutex> mutex(_lock);
_complete=true;
return _function(std::get<Is>(tup)...);
}
设计还有很多,所以我会发布一个链接到我的项目的git仓库。
我想知道是否需要锁定函数work()
,然后需要锁定func()
,或者甚至是个好主意?
这是repo
编辑: 所以呼叫顺序评估为......
Worker::work();
//which internally calls the
operator()();
//which internally calls the
func();