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_semaphore.cpp

93 lines
2.8 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 <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;
}