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.

85 lines
2.2 KiB
C++

12 months ago
/*
* 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 <csignal>
#include <atomic>
#include "Util/TimeTicker.h"
#include "Util/logger.h"
#include "Thread/threadgroup.h"
#include "Thread/semaphore.h"
using namespace std;
using namespace toolkit;
#define MAX_TASK_SIZE (1000 * 10000)
semaphore g_sem;//信号量
atomic_llong g_produced(0);
atomic_llong g_consumed(0);
//消费者线程
void onConsum() {
while (true) {
g_sem.wait();
if (++g_consumed > g_produced) {
//如果打印这句log则表明有bug
ErrorL << g_consumed << " > " << g_produced;
}
}
}
//生产者线程
void onProduce() {
while(true){
++ g_produced;
g_sem.post();
if(g_produced >= MAX_TASK_SIZE){
break;
}
}
}
int main() {
//初始化log
Logger::Instance().add(std::make_shared<ConsoleChannel>());
Ticker ticker;
thread_group thread_producer;
for (size_t i = 0; i < thread::hardware_concurrency(); ++i) {
thread_producer.create_thread([]() {
//1个生产者线程
onProduce();
});
}
thread_group thread_consumer;
for (int i = 0; i < 4; ++i) {
thread_consumer.create_thread([i]() {
//4个消费者线程
onConsum();
});
}
//等待所有生成者线程退出
thread_producer.join_all();
DebugL << "生产者线程退出,耗时:" << ticker.elapsedTime() << "ms," << "生产任务数:" << g_produced << ",消费任务数:" << g_consumed;
int i = 5;
while(-- i){
DebugL << "程序退出倒计时:" << i << ",消费任务数:" << g_consumed;
sleep(1);
}
//程序强制退出可能core dump在程序推出时生产的任务数应该跟消费任务数一致
WarnL << "强制关闭消费线程可能触发core dump" ;
return 0;
}