66 lines
2.2 KiB
C++
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;
|
||
}
|