Говорят, что thread_local имеет одну копию на поток.
Итак, если поток threadPool (назовем его A) создает другой поток (назовем его B), переменные thread_local (local_work_queue) в потоках A и B — это две разные вещи。
Поэтому я путаю это, когда задача саммита пула в потоке пула A (int main()), как она может получить доступ к local_work_queue в подпотоке B??? они совершенно неактуальны.
Функция submit находится в потоке пула, а local_work_queue инициализируется только в подпотоке, поэтому в функции отправки local_work_queue всегда будет nullptr, не так ли?
Ниже приведен код:
class thread_pool
{
typedef std::queue<function_wrapper> local_queue_type;
static thread_local std::unique_ptr<local_queue_type> local_work_queue;
std::vector<std::thread> threads;`
thread_pool()
{
unsigned const thread_count=std::thread::hardware_concurrency();
for(unsigned i=0;i<thread_count;++i)
{
threads.push_back(
std::thread(&thread_pool::worker_thread,this,i));
}
}
void worker_thread()
{
local_work_queue.reset(new local_queue_type); //just init in the sub thread
while(1)
{
function_wrapper task;
if(local_work_queue && !local_work_queue->empty())
{
task=std::move(local_work_queue->front());
local_work_queue->pop();
task();
}
else
{
std::this_thread::yield();
}
}
}
template<typename FunctionType>
std::future<typename std::result_of<FunctionType()>::type>submit(FunctionType f)
{
typedef typename std::result_of<FunctionType()>::type result_type;
std::packaged_task<result_type()> task(f);
std::future<result_type> res(task.get_future());
if(local_work_queue) //function submit is in pool thread, and local_work_queue only init in sub thred, so in this ,local_work_queue will away nullptr, isn't it? so confuse how the code work.
{
local_work_queue->push(std::move(task));
}
return res;
}
};
void func()
{
std::cout<<"test"<<std::endl;
}
int main()
{
thread_pool p;
p.submit(func);
}