|
|
/*
|
|
|
* 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);
|
|
|
|
|
|
//消费者线程 [AUTO-TRANSLATED:db1fb231]
|
|
|
// Consumer thread
|
|
|
void onConsum() {
|
|
|
while (true) {
|
|
|
g_sem.wait();
|
|
|
if (++g_consumed > g_produced) {
|
|
|
//如果打印这句log则表明有bug [AUTO-TRANSLATED:190165e0]
|
|
|
// If this log is printed, it indicates a bug
|
|
|
ErrorL << g_consumed << " > " << g_produced;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
//生产者线程 [AUTO-TRANSLATED:3f37e15e]
|
|
|
// Producer thread
|
|
|
void onProduce() {
|
|
|
while(true){
|
|
|
++ g_produced;
|
|
|
g_sem.post();
|
|
|
if(g_produced >= MAX_TASK_SIZE){
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
int main() {
|
|
|
//初始化log [AUTO-TRANSLATED:585df223]
|
|
|
// Initialize 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个生产者线程 [AUTO-TRANSLATED:a9a01b88]
|
|
|
// 1 producer thread
|
|
|
onProduce();
|
|
|
});
|
|
|
}
|
|
|
|
|
|
thread_group thread_consumer;
|
|
|
for (int i = 0; i < 4; ++i) {
|
|
|
thread_consumer.create_thread([i]() {
|
|
|
//4个消费者线程 [AUTO-TRANSLATED:9dabe877]
|
|
|
// 4 consumer threads
|
|
|
onConsum();
|
|
|
});
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//等待所有生成者线程退出 [AUTO-TRANSLATED:321d2677]
|
|
|
// Wait for all producer threads to exit
|
|
|
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;在程序推出时,生产的任务数应该跟消费任务数一致 [AUTO-TRANSLATED:59593bf0]
|
|
|
// The program may force exit and core dump; when the program exits, the number of produced tasks should be consistent with the number of consumed tasks
|
|
|
WarnL << "强制关闭消费线程,可能触发core dump" ;
|
|
|
return 0;
|
|
|
}
|