线程池Mutex用法

时间:2014-06-09 23:51:03

标签: c++ multithreading c++11 thread-safety mutex

我正在开发一个线程池,并一直在尝试找出处理线程安全的最佳方法。我想知道我的互斥锁用法是否“正确”,如果不是我应该如何更改它。我使用的是c ++ 11 std::threadstd::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();

0 个答案:

没有答案