线程池代码是否尝试双重执行任务?



我已经从https://pastebin.com/MM5kSvH6复制了下面的线程池实现。看起来都很好,但是我不明白32行和71行的逻辑。这两行不都试图执行函数吗?我认为在线程池中,线程应该从任务队列拉任务,然后执行它?从这个意义上说,第71行看起来不错,但我对第32行感到困惑。而不是将任务添加到队列中,为什么它试图执行相同的任务?

#include <condition_variable>
#include <functional>
#include <iostream>
#include <future>
#include <vector>
#include <thread>
#include <queue>

class ThreadPool
{
public:
using Task = std::function<void()>;

explicit ThreadPool(std::size_t numThreads)
{
start(numThreads);
}

~ThreadPool()
{
stop();
}

template<class T>
auto enqueue(T task)->std::future<decltype(task())>
{
auto wrapper = std::make_shared<std::packaged_task<decltype(task()) ()>>(std::move(task));

{
std::unique_lock<std::mutex> lock{mEventMutex};
mTasks.emplace([=] {
(*wrapper)();
});
}

mEventVar.notify_one();
return wrapper->get_future();
}

private:
std::vector<std::thread> mThreads;

std::condition_variable mEventVar;

std::mutex mEventMutex;
bool mStopping = false;

std::queue<Task> mTasks;

void start(std::size_t numThreads)
{
for (auto i = 0u; i < numThreads; ++i)
{
mThreads.emplace_back([=] {
while (true)
{
Task task;

{
std::unique_lock<std::mutex> lock{mEventMutex};

mEventVar.wait(lock, [=] { return mStopping || !mTasks.empty(); });

if (mStopping && mTasks.empty())
break;

task = std::move(mTasks.front());
mTasks.pop();
}

task();
}
});
}
}

void stop() noexcept
{
{
std::unique_lock<std::mutex> lock{mEventMutex};
mStopping = true;
}

mEventVar.notify_all();

for (auto &thread : mThreads)
thread.join();
}
};

int main()
{
{
ThreadPool pool{36};

for (auto i = 0; i < 36; ++i)
{
pool.enqueue([] {
auto f = 1000000000;
while (f > 1)
f /= 1.00000001;
});
}
}

return 0;
}

第32行添加一个lambda,该lambda在调用时执行任务,而第71行执行该lambda。一个简单地委托给另一个。明确地说,第32行只是lambda的一部分,它在第72行被调用执行。我们没有双重执行。相反,第72行执行第32行是其中一部分的代码。

相关内容

  • 没有找到相关文章

最新更新