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++

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

/*
* 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;
}