You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
MpLive/ZLMediaKit/3rdpart/ZLToolKit/tests/test_threadPool.cpp

66 lines
2.2 KiB
C++

/*
* Copyright (c) 2016 The ZLToolKit project authors. All Rights Reserved.
*
* This file is part of ZLToolKit(https://github.com/ZLMediaKit/ZLToolKit).
*
* Use of this source code is governed by MIT license that can be found in the
* LICENSE file in the root of the source tree. All contributing project authors
* may be found in the AUTHORS file in the root of the source tree.
*/
#include <chrono>
#include "Util/logger.h"
#include "Util/onceToken.h"
#include "Util/TimeTicker.h"
#include "Thread/ThreadPool.h"
using namespace std;
using namespace toolkit;
int main() {
//初始化日志系统 [AUTO-TRANSLATED:25c549de]
// Initialize the logging system
Logger::Instance().add(std::make_shared<ConsoleChannel>());
Logger::Instance().setWriter(std::make_shared<AsyncLogWriter>());
ThreadPool pool(thread::hardware_concurrency(), ThreadPool::PRIORITY_HIGHEST, true);
//每个任务耗时3秒 [AUTO-TRANSLATED:c1b83e8e]
// Each task takes 3 seconds
auto task_second = 3;
//每个线程平均执行4次任务总耗时应该为12秒 [AUTO-TRANSLATED:ceab38cc]
// Each thread executes 4 tasks on average, the total time should be 12 seconds
auto task_count = thread::hardware_concurrency() * 4;
semaphore sem;
vector<int> vec;
vec.resize(task_count);
Ticker ticker;
{
//放在作用域中确保token引用次数减1 [AUTO-TRANSLATED:a81d2393]
// Put it in a scope to ensure the token reference count is decremented
auto token = std::make_shared<onceToken>(nullptr, [&]() {
sem.post();
});
for (auto i = 0; i < task_count; ++i) {
pool.async([token, i, task_second, &vec]() {
setThreadName(("thread pool " + to_string(i)).data());
std::this_thread::sleep_for(std::chrono::seconds(task_second)); //休眠三秒
InfoL << "task " << i << " done!";
vec[i] = i;
});
}
}
sem.wait();
InfoL << "all task done, used milliseconds:" << ticker.elapsedTime();
//打印执行结果 [AUTO-TRANSLATED:08995cc8]
// Print the execution result
for (auto i = 0; i < task_count; ++i) {
InfoL << vec[i];
}
return 0;
}