c++ 线程交叉场景试验

2024-05-08 13:04
文章标签 c++ 线程 场景 试验 交叉

本文主要是介绍c++ 线程交叉场景试验,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.需求

  1. 处理一个列表的数据,要求按照列表的数据处理10个数据
  2. 可以使用多线程处理,但是针对每个线程,1~10的处理顺序不能变。
  3. 每个数据的处理必须原子,即只有一个线程可以针对某个数据进行处理,但是10个数据是可以由10个线程并行处理的。只是有前面的单线程内的处理顺序要求。

2.设计

2.1.设计说明

设计一个处理的监控链,为每个数据定义一个线程锁定的指针,叫锁定指针,表示数据已经被锁定,后续的线程需要排队。
为每个线程定义一个激活指针,如果有线程需要激活那么就通过该指针激活等待中的线程。
比如线程1开始处理数据1了,那么就把自己的指针设置给数据1的锁定指针
这时候如果线程2也想处数据1,会有两种情况,如下分别处理
情况1:数据没有任何线程锁定,那么按照线程1的方式处理数据1
情况2:线程1正在处理数据,那么我把我的指针设置给线程1的激活指针,同时把我的指针设置给数据1的锁定指针。这时候如果有线程3要处理数据1,处理的方和线程2的处理方法相同。

2.2.设计要点
  • 如果资源未被占用,那么锁资源,开始处理,由锁定指针承载。
  • 如果资源已经被占用了,所有等待的线程排队,形成一条激活链,由激活指针承载。

这个设计的关键就是两个指针,如下用类图说明。

类图如下:

​​​​​​​

3.代码

#include <iostream>  
#include <thread>  
#include <queue>
#include <mutex>  
#include <condition_variable>  
#include <atomic>  
#include <windows.h>  using namespace std;
class BoxDatas; 
class MyThred;
std::mutex printmtx;//数据处理对象
class Data
{
public:int id = 0;int count = 0;
};
class BoxData
{
public:Data data;BoxData(int id){data.id = id;}MyThred* handelThread = NULL;std::mutex mtx;
};//数据容器承担多线程的处理对数据的保护功能
class BoxDatas
{
public:static BoxDatas my;static BoxDatas getMy() {return my;}static const int max = 10;BoxDatas() {for (int i = 0; i < max; i++){bs[i] = new BoxData(i);}}BoxData* bs[max];//所有数据加工只都超过10可以结束线程bool isStop() {for (size_t i = 0; i < max; i++){if (bs[i]->data.count < 10) {return false;}}return true;}
};BoxDatas BoxDatas::my = BoxDatas();//线程承载类
class MyThred
{
public:int id;std::mutex mtx;std::condition_variable cv;std::atomic_bool ready = false;MyThred* p_next = nullptr;//构造函数MyThred(int id) {this->id = id;}//数据处理函数void funBox(BoxData* boxData) {DWORD threadId = GetCurrentThreadId();//如果已经有线程占用了,那么等待std::unique_lock<std::mutex> lock(boxData->mtx);//这个锁的目标是: boxData->handelThreadif (boxData->handelThread != NULL) {std::unique_lock<std::mutex> lock2(boxData->handelThread->mtx);//这个锁的目标是:handelThread->p_nextboxData->handelThread->p_next = this;boxData->handelThread = this;//lock2.unlock();lock.unlock();//cout <<"Thread id:"<< threadId <<"  data Id:" << boxData->data.id << "  wait \n";print(boxData->data.id, "wait");cv.wait(lock2);// 无条件激活等待的线程//cv.wait(lock2, [this](){ return ready.load(); }); // 等待直到ready为true  }else{boxData->handelThread = this;lock.unlock();}//cout << "Thread id:" << threadId << "  data Id :" << boxData->data.id << " exe \n";print(boxData->data.id,"exe");//数据处理dataProcessing(boxData->data);std::unique_lock<std::mutex> lock2(mtx);//这个锁的目标是:handelThread->p_next//处理完成后需要调用等待激活的线程if (p_next != nullptr) {p_next->activeThread();}else{std::unique_lock<std::mutex> lock3(boxData->mtx);//这个锁的目标是: boxData->handelThreadboxData->handelThread = nullptr;lock3.unlock();}lock2.unlock();}//数据处理逻辑void dataProcessing(Data& data) {//加一个延时填充线程执行占用的时间//std::this_thread::sleep_for(std::chrono::seconds(5));data.count++;DWORD threadId = GetCurrentThreadId();//cout << "Thread id:" << id << "  data Id:" << data.id <<"  data value:"<< data.count << "  value \n";print(data.id,"value", data.count);}void print(int dataId,std::string funType) {DWORD threadId = GetCurrentThreadId();std::unique_lock<std::mutex> lock(printmtx);cout << "Thread id:" << threadId << "  data Id:" << dataId << "  " << funType << "\n";lock.unlock();}void print(int dataId, std::string funType,int value) {DWORD threadId = GetCurrentThreadId();std::unique_lock<std::mutex> lock(printmtx);cout << "Thread id:" << threadId << "  data Id:" << dataId << "  data value:"<< value <<"  " << funType << "\n";lock.unlock();}//此线程激活void activeThread() {ready = true;cv.notify_one(); // 唤醒一个等待在cv上的线程(如果有的话)}//线程主函数void mainThread() {while (true){for(BoxData* bd : BoxDatas::getMy().bs){funBox(bd);}//如果完成了数据,那么退出if (BoxDatas::getMy().isStop()) {break;}}}//线程运行std::thread run() {return std::thread([this] {mainThread(); });}
};//入口函数
int main() {std::thread threads[5];//线程初始化for (int i = 0; i < 5; i++){MyThred thrend(i);threads[i] = thrend.run();}//防止程序提取退出for (size_t i = 0; i < 5; i++){threads[i].join();}std::cout << "Hello from thread!\n";return 0;
}

4.运行结果

Thread id:15512  data Id:0  exe
Thread id:19512  data Id:0  wait
Thread id:15512  data Id:0  data value:1  value
Thread id:9320  data Id:0  wait
Thread id:10556  data Id:0  wait
Thread id:15512  data Id:1  exe
Thread id:25516  data Id:0  wait
Thread id:15512  data Id:1  data value:1  value
Thread id:19512  data Id:0  exe
Thread id:15512  data Id:2  exe
Thread id:9320  data Id:0  exe
Thread id:19512  data Id:0  data value:2  value
Thread id:15512  data Id:2  data value:1  value
Thread id:9320  data Id:0  data value:3  value
Thread id:19512  data Id:1  wait
Thread id:10556  data Id:0  exe
Thread id:15512  data Id:3  exe
Thread id:9320  data Id:1  wait
Thread id:10556  data Id:0  data value:4  value
Thread id:15512  data Id:3  data value:1  value
Thread id:19512  data Id:1  exe
Thread id:25516  data Id:0  exe
Thread id:10556  data Id:1  wait
Thread id:19512  data Id:1  data value:2  value
Thread id:25516  data Id:0  data value:5  value
Thread id:9320  data Id:1  exe
Thread id:15512  data Id:4  exe
Thread id:10556  data Id:1  exe
Thread id:19512  data Id:2  wait
Thread id:9320  data Id:1  data value:3  value
Thread id:15512  data Id:4  data value:1  value
Thread id:10556  data Id:1  data value:4  value
Thread id:25516  data Id:1  wait
Thread id:19512  data Id:2  exe
Thread id:9320  data Id:2  wait
Thread id:19512  data Id:2  data value:2  value
Thread id:10556  data Id:2  wait
Thread id:15512  data Id:5  exe
Thread id:15512  data Id:5  data value:1  value
Thread id:25516  data Id:1  exe
Thread id:25516  data Id:1  data value:5  value
Thread id:9320  data Id:2  exe
Thread id:9320  data Id:2  data value:3  value
Thread id:19512  data Id:3  wait
Thread id:10556  data Id:2  exe
Thread id:15512  data Id:6  exe
Thread id:15512  data Id:6  data value:1  value
Thread id:10556  data Id:2  data value:4  value
Thread id:25516  data Id:2  wait
Thread id:19512  data Id:3  exe
Thread id:9320  data Id:3  wait
Thread id:19512  data Id:3  data value:2  value
Thread id:10556  data Id:3  wait
Thread id:15512  data Id:7  exe
Thread id:15512  data Id:7  data value:1  value
Thread id:25516  data Id:2  exe
Thread id:25516  data Id:2  data value:5  value
Thread id:9320  data Id:3  exe
Thread id:9320  data Id:3  data value:3  value
Thread id:19512  data Id:4  wait
Thread id:10556  data Id:3  exe
Thread id:10556  data Id:3  data value:4  value
Thread id:25516  data Id:3  wait
Thread id:19512  data Id:4  exe
Thread id:19512  data Id:4  data value:2  value
Thread id:9320  data Id:4  wait
Thread id:25516  data Id:3  exe
Thread id:25516  data Id:3  data value:5  value
Thread id:10556  data Id:4  wait
Thread id:15512  data Id:8  exe
Thread id:15512  data Id:8  data value:1  value
Thread id:19512  data Id:5  wait
Thread id:9320  data Id:4  exe
Thread id:9320  data Id:4  data value:3  value
Thread id:25516  data Id:4  wait
Thread id:10556  data Id:4  exe
Thread id:10556  data Id:4  data value:4  value
Thread id:15512  data Id:9  exe
Thread id:15512  data Id:9  data value:1  value
Thread id:19512  data Id:5  exe
Thread id:19512  data Id:5  data value:2  value
Thread id:9320  data Id:5  wait
Thread id:25516  data Id:4  exe
Thread id:10556  data Id:5  wait
Thread id:25516  data Id:4  data value:5  value
Thread id:19512  data Id:6  wait
Thread id:15512  data Id:0  wait
Thread id:9320  data Id:5  exe
Thread id:9320  data Id:5  data value:3  value
Thread id:25516  data Id:5  wait
Thread id:10556  data Id:5  exe
Thread id:10556  data Id:5  data value:4  value
Thread id:19512  data Id:6  exe
Thread id:9320  data Id:6  wait
Thread id:15512  data Id:0  exe
Thread id:19512  data Id:6  data value:2  value
Thread id:25516  data Id:5  exe
Thread id:10556  data Id:6  wait
Thread id:15512  data Id:0  data value:6  value
Thread id:25516  data Id:5  data value:5  value
Thread id:9320  data Id:6  exe
Thread id:19512  data Id:7  wait
Thread id:9320  data Id:6  data value:3  value
Thread id:10556  data Id:6  exe
Thread id:15512  data Id:1  wait
Thread id:10556  data Id:6  data value:4  value
Thread id:19512  data Id:7  exe
Thread id:25516  data Id:6  wait
Thread id:19512  data Id:7  data value:2  value
Thread id:15512  data Id:1  exe
Thread id:9320  data Id:7  wait
Thread id:15512  data Id:1  data value:6  value
Thread id:25516  data Id:6  exe
Thread id:25516  data Id:6  data value:5  value
Thread id:10556  data Id:7  wait
Thread id:9320  data Id:7  exe
Thread id:19512  data Id:8  wait
Thread id:9320  data Id:7  data value:3  value
Thread id:25516  data Id:7  wait
Thread id:15512  data Id:2  wait
Thread id:10556  data Id:7  exe
Thread id:10556  data Id:7  data value:4  value
Thread id:9320  data Id:8  wait
Thread id:19512  data Id:8  exe
Thread id:19512  data Id:8  data value:2  value
Thread id:25516  data Id:7  exe
Thread id:25516  data Id:7  data value:5  value
Thread id:15512  data Id:2  exe
Thread id:15512  data Id:2  data value:6  value
Thread id:10556  data Id:8  wait
Thread id:9320  data Id:8  exe
Thread id:9320  data Id:8  data value:3  value
Thread id:19512  data Id:9  wait
Thread id:15512  data Id:3  wait
Thread id:25516  data Id:8  wait
Thread id:19512  data Id:9  exe
Thread id:19512  data Id:9  data value:2  value
Thread id:15512  data Id:3  exe
Thread id:9320  data Id:9  wait
Thread id:10556  data Id:8  exe
Thread id:10556  data Id:8  data value:4  value
Thread id:25516  data Id:8  exe
Thread id:19512  data Id:0  wait
Thread id:15512  data Id:3  data value:6  value
Thread id:25516  data Id:8  data value:5  value
Thread id:9320  data Id:9  exe
Thread id:10556  data Id:9  wait
Thread id:9320  data Id:9  data value:3  value
Thread id:19512  data Id:0  exe
Thread id:19512  data Id:0  data value:7  value
Thread id:15512  data Id:4  wait
Thread id:10556  data Id:9  exe
Thread id:25516  data Id:9  wait
Thread id:10556  data Id:9  data value:4  value
Thread id:19512  data Id:1  wait
Thread id:9320  data Id:0  wait
Thread id:15512  data Id:4  exe
Thread id:15512  data Id:4  data value:6  value
Thread id:10556  data Id:0  wait
Thread id:25516  data Id:9  exe
Thread id:9320  data Id:0  exe
Thread id:19512  data Id:1  exe
Thread id:19512  data Id:1  data value:7  value
Thread id:25516  data Id:9  data value:5  value
Thread id:9320  data Id:0  data value:8  value
Thread id:15512  data Id:5  wait
Thread id:10556  data Id:0  exe
Thread id:10556  data Id:0  data value:9  value
Thread id:19512  data Id:2  wait
Thread id:9320  data Id:1  wait
Thread id:25516  data Id:0  wait
Thread id:19512  data Id:2  exe
Thread id:15512  data Id:5  exe
Thread id:9320  data Id:1  exe
Thread id:10556  data Id:1  wait
Thread id:19512  data Id:2  data value:7  value
Thread id:15512  data Id:5  data value:6  value
Thread id:9320  data Id:1  data value:8  value
Thread id:25516  data Id:0  exe
Thread id:25516  data Id:0  data value:10  value
Thread id:19512  data Id:3  wait
Thread id:10556  data Id:1  exe
Thread id:10556  data Id:1  data value:9  value
Thread id:15512  data Id:6  wait
Thread id:25516  data Id:1  wait
Thread id:9320  data Id:2  wait
Thread id:15512  data Id:6  exe
Thread id:15512  data Id:6  data value:6  value
Thread id:25516  data Id:1  exe
Thread id:25516  data Id:1  data value:10  value
Thread id:19512  data Id:3  exe
Thread id:10556  data Id:2  wait
Thread id:19512  data Id:3  data value:7  value
Thread id:9320  data Id:2  exe
Thread id:15512  data Id:7  wait
Thread id:9320  data Id:2  data value:8  value
Thread id:10556  data Id:2  exe
Thread id:25516  data Id:2  wait
Thread id:10556  data Id:2  data value:9  value
Thread id:15512  data Id:7  exe
Thread id:19512  data Id:4  wait
Thread id:15512  data Id:7  data value:6  value
Thread id:25516  data Id:2  exe
Thread id:25516  data Id:2  data value:10  value
Thread id:9320  data Id:3  wait
Thread id:19512  data Id:4  exe
Thread id:10556  data Id:3  wait
Thread id:19512  data Id:4  data value:7  value
Thread id:25516  data Id:3  wait
Thread id:15512  data Id:8  wait
Thread id:9320  data Id:3  exe
Thread id:9320  data Id:3  data value:8  value
Thread id:19512  data Id:5  wait
Thread id:10556  data Id:3  exe
Thread id:15512  data Id:8  exe
Thread id:25516  data Id:3  exe
Thread id:9320  data Id:4  wait
Thread id:10556  data Id:3  data value:9  value
Thread id:10556  data Id:4  wait
Thread id:25516  data Id:3  data value:10  value
Thread id:19512  data Id:5  exe
Thread id:15512  data Id:8  data value:6  value
Thread id:9320  data Id:4  exe
Thread id:9320  data Id:4  data value:8  value
Thread id:19512  data Id:5  data value:7  value
Thread id:25516  data Id:4  wait
Thread id:10556  data Id:4  exe
Thread id:15512  data Id:9  wait
Thread id:10556  data Id:4  data value:9  value
Thread id:19512  data Id:6  wait
Thread id:9320  data Id:5  wait
Thread id:25516  data Id:4  exe
Thread id:10556  data Id:5  wait
Thread id:25516  data Id:4  data value:10  value
Thread id:15512  data Id:9  exe
Thread id:15512  data Id:9  data value:6  value
Thread id:19512  data Id:6  exe
Thread id:25516  data Id:5  wait
Thread id:9320  data Id:5  exe
Thread id:9320  data Id:5  data value:8  value
Thread id:10556  data Id:5  exe
Thread id:10556  data Id:5  data value:9  value
Thread id:19512  data Id:6  data value:7  value
Thread id:15512  data Id:0  wait
Thread id:25516  data Id:5  exe
Thread id:9320  data Id:6  wait
Thread id:25516  data Id:5  data value:10  value
Thread id:19512  data Id:7  wait
Thread id:10556  data Id:6  wait
Thread id:15512  data Id:0  exe
Thread id:15512  data Id:0  data value:11  value
Thread id:25516  data Id:6  wait
Thread id:9320  data Id:6  exe
Thread id:9320  data Id:6  data value:8  value
Thread id:19512  data Id:7  exe
Thread id:19512  data Id:7  data value:7  value
Thread id:10556  data Id:6  exe
Thread id:10556  data Id:6  data value:9  value
Thread id:15512  data Id:1  wait
Thread id:25516  data Id:6  exe
Thread id:25516  data Id:6  data value:10  value
Thread id:9320  data Id:7  wait
Thread id:10556  data Id:7  wait
Thread id:19512  data Id:8  wait
Thread id:9320  data Id:7  exe
Thread id:9320  data Id:7  data value:8  value
Thread id:10556  data Id:7  exe
Thread id:25516  data Id:7  wait
Thread id:15512  data Id:1  exe
Thread id:15512  data Id:1  data value:11  value
Thread id:19512  data Id:8  exe
Thread id:19512  data Id:8  data value:7  value
Thread id:10556  data Id:7  data value:9  value
Thread id:9320  data Id:8  wait
Thread id:25516  data Id:7  exe
Thread id:15512  data Id:2  wait
Thread id:25516  data Id:7  data value:10  value
Thread id:10556  data Id:8  wait
Thread id:19512  data Id:9  wait
Thread id:9320  data Id:8  exe
Thread id:9320  data Id:8  data value:8  value
Thread id:25516  data Id:8  wait
Thread id:15512  data Id:2  exe
Thread id:15512  data Id:2  data value:11  value
Thread id:10556  data Id:8  exe
Thread id:10556  data Id:8  data value:9  value
Thread id:19512  data Id:9  exe
Thread id:19512  data Id:9  data value:7  value
Thread id:9320  data Id:9  wait
Thread id:25516  data Id:8  exe
Thread id:25516  data Id:8  data value:10  value
Thread id:15512  data Id:3  wait
Thread id:19512  data Id:0  wait
Thread id:10556  data Id:9  wait
Thread id:15512  data Id:3  exe
Thread id:15512  data Id:3  data value:11  value
Thread id:19512  data Id:0  exe
Thread id:19512  data Id:0  data value:12  value
Thread id:9320  data Id:9  exe
Thread id:9320  data Id:9  data value:8  value
Thread id:25516  data Id:9  wait
Thread id:10556  data Id:9  exe
Thread id:10556  data Id:9  data value:9  value
Thread id:15512  data Id:4  wait
Thread id:9320  data Id:0  wait
Thread id:19512  data Id:1  wait
Thread id:15512  data Id:4  exe
Thread id:15512  data Id:4  data value:11  value
Thread id:9320  data Id:0  exe
Thread id:9320  data Id:0  data value:13  value
Thread id:25516  data Id:9  exe
Thread id:25516  data Id:9  data value:10  value
Thread id:10556  data Id:0  wait
Thread id:19512  data Id:1  exe
Thread id:19512  data Id:1  data value:12  value
Thread id:15512  data Id:5  wait
Thread id:10556  data Id:0  exe
Thread id:10556  data Id:0  data value:14  value
Thread id:9320  data Id:1  wait
Thread id:15512  data Id:5  exe
Thread id:15512  data Id:5  data value:11  value
Thread id:19512  data Id:2  wait
Thread id:9320  data Id:1  exe
Thread id:9320  data Id:1  data value:13  value
Thread id:10556  data Id:1  wait
Thread id:19512  data Id:2  exe
Thread id:19512  data Id:2  data value:12  value
Thread id:15512  data Id:6  wait
Thread id:10556  data Id:1  exe
Thread id:10556  data Id:1  data value:14  value
Thread id:9320  data Id:2  wait
Thread id:15512  data Id:6  exe
Thread id:15512  data Id:6  data value:11  value
Thread id:19512  data Id:3  wait
Thread id:9320  data Id:2  exe
Thread id:9320  data Id:2  data value:13  value
Thread id:10556  data Id:2  wait
Thread id:19512  data Id:3  exe
Thread id:19512  data Id:3  data value:12  value
Thread id:15512  data Id:7  wait
Thread id:10556  data Id:2  exe
Thread id:10556  data Id:2  data value:14  value
Thread id:9320  data Id:3  wait
Thread id:15512  data Id:7  exe
Thread id:15512  data Id:7  data value:11  value
Thread id:19512  data Id:4  wait
Thread id:9320  data Id:3  exe
Thread id:9320  data Id:3  data value:13  value
Thread id:10556  data Id:3  wait
Thread id:19512  data Id:4  exe
Thread id:19512  data Id:4  data value:12  value
Thread id:15512  data Id:8  wait
Thread id:10556  data Id:3  exe
Thread id:10556  data Id:3  data value:14  value
Thread id:9320  data Id:4  wait
Thread id:15512  data Id:8  exe
Thread id:15512  data Id:8  data value:11  value
Thread id:19512  data Id:5  wait
Thread id:9320  data Id:4  exe
Thread id:9320  data Id:4  data value:13  value
Thread id:10556  data Id:4  wait
Thread id:19512  data Id:5  exe
Thread id:19512  data Id:5  data value:12  value
Thread id:15512  data Id:9  wait
Thread id:10556  data Id:4  exe
Thread id:10556  data Id:4  data value:14  value
Thread id:9320  data Id:5  wait
Thread id:15512  data Id:9  exe
Thread id:15512  data Id:9  data value:11  value
Thread id:19512  data Id:6  wait
Thread id:9320  data Id:5  exe
Thread id:9320  data Id:5  data value:13  value
Thread id:10556  data Id:5  wait
Thread id:19512  data Id:6  exe
Thread id:19512  data Id:6  data value:12  value
Thread id:9320  data Id:6  wait
Thread id:10556  data Id:5  exe
Thread id:10556  data Id:5  data value:14  value
Thread id:19512  data Id:7  wait
Thread id:9320  data Id:6  exe
Thread id:10556  data Id:6  wait
Thread id:9320  data Id:6  data value:13  value
Thread id:19512  data Id:7  exe
Thread id:19512  data Id:7  data value:12  value
Thread id:9320  data Id:7  wait
Thread id:10556  data Id:6  exe
Thread id:10556  data Id:6  data value:14  value
Thread id:19512  data Id:8  wait
Thread id:9320  data Id:7  exe
Thread id:9320  data Id:7  data value:13  value
Thread id:10556  data Id:7  wait
Thread id:19512  data Id:8  exe
Thread id:19512  data Id:8  data value:12  value
Thread id:9320  data Id:8  wait
Thread id:10556  data Id:7  exe
Thread id:10556  data Id:7  data value:14  value
Thread id:19512  data Id:9  wait
Thread id:9320  data Id:8  exe
Thread id:9320  data Id:8  data value:13  value
Thread id:10556  data Id:8  wait
Thread id:19512  data Id:9  exe
Thread id:19512  data Id:9  data value:12  value
Thread id:9320  data Id:9  wait
Thread id:10556  data Id:8  exe
Thread id:10556  data Id:8  data value:14  value
Thread id:10556  data Id:9  wait
Thread id:9320  data Id:9  exe
Thread id:9320  data Id:9  data value:13  value
Thread id:10556  data Id:9  exe
Thread id:10556  data Id:9  data value:14  value
Hello from thread!

这篇关于c++ 线程交叉场景试验的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/970389

相关文章

C++中RAII资源获取即初始化

《C++中RAII资源获取即初始化》RAII通过构造/析构自动管理资源生命周期,确保安全释放,本文就来介绍一下C++中的RAII技术及其应用,具有一定的参考价值,感兴趣的可以了解一下... 目录一、核心原理与机制二、标准库中的RAII实现三、自定义RAII类设计原则四、常见应用场景1. 内存管理2. 文件操

C++中零拷贝的多种实现方式

《C++中零拷贝的多种实现方式》本文主要介绍了C++中零拷贝的实现示例,旨在在减少数据在内存中的不必要复制,从而提高程序性能、降低内存使用并减少CPU消耗,零拷贝技术通过多种方式实现,下面就来了解一下... 目录一、C++中零拷贝技术的核心概念二、std::string_view 简介三、std::stri

C++高效内存池实现减少动态分配开销的解决方案

《C++高效内存池实现减少动态分配开销的解决方案》C++动态内存分配存在系统调用开销、碎片化和锁竞争等性能问题,内存池通过预分配、分块管理和缓存复用解决这些问题,下面就来了解一下... 目录一、C++内存分配的性能挑战二、内存池技术的核心原理三、主流内存池实现:TCMalloc与Jemalloc1. TCM

C++ 函数 strftime 和时间格式示例详解

《C++函数strftime和时间格式示例详解》strftime是C/C++标准库中用于格式化日期和时间的函数,定义在ctime头文件中,它将tm结构体中的时间信息转换为指定格式的字符串,是处理... 目录C++ 函数 strftipythonme 详解一、函数原型二、功能描述三、格式字符串说明四、返回值五

Python主动抛出异常的各种用法和场景分析

《Python主动抛出异常的各种用法和场景分析》在Python中,我们不仅可以捕获和处理异常,还可以主动抛出异常,也就是以类的方式自定义错误的类型和提示信息,这在编程中非常有用,下面我将详细解释主动抛... 目录一、为什么要主动抛出异常?二、基本语法:raise关键字基本示例三、raise的多种用法1. 抛

Java中实现线程的创建和启动的方法

《Java中实现线程的创建和启动的方法》在Java中,实现线程的创建和启动是两个不同但紧密相关的概念,理解为什么要启动线程(调用start()方法)而非直接调用run()方法,是掌握多线程编程的关键,... 目录1. 线程的生命周期2. start() vs run() 的本质区别3. 为什么必须通过 st

C++作用域和标识符查找规则详解

《C++作用域和标识符查找规则详解》在C++中,作用域(Scope)和标识符查找(IdentifierLookup)是理解代码行为的重要概念,本文将详细介绍这些规则,并通过实例来说明它们的工作原理,需... 目录作用域标识符查找规则1. 普通查找(Ordinary Lookup)2. 限定查找(Qualif

Linux实现线程同步的多种方式汇总

《Linux实现线程同步的多种方式汇总》本文详细介绍了Linux下线程同步的多种方法,包括互斥锁、自旋锁、信号量以及它们的使用示例,通过这些同步机制,可以解决线程安全问题,防止资源竞争导致的错误,示例... 目录什么是线程同步?一、互斥锁(单人洗手间规则)适用场景:特点:二、条件变量(咖啡厅取餐系统)工作流

Java中常见队列举例详解(非线程安全)

《Java中常见队列举例详解(非线程安全)》队列用于模拟队列这种数据结构,队列通常是指先进先出的容器,:本文主要介绍Java中常见队列(非线程安全)的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录一.队列定义 二.常见接口 三.常见实现类3.1 ArrayDeque3.1.1 实现原理3.1.2

SpringBoot3中使用虚拟线程的完整步骤

《SpringBoot3中使用虚拟线程的完整步骤》在SpringBoot3中使用Java21+的虚拟线程(VirtualThreads)可以显著提升I/O密集型应用的并发能力,这篇文章为大家介绍了详细... 目录1. 环境准备2. 配置虚拟线程方式一:全局启用虚拟线程(Tomcat/Jetty)方式二:异步