当前位置: 首页 > news >正文

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++ 线程交叉场景试验

1.需求 处理一个列表的数据&#xff0c;要求按照列表的数据处理10个数据可以使用多线程处理&#xff0c;但是针对每个线程&#xff0c;1~10的处理顺序不能变。每个数据的处理必须原子&#xff0c;即只有一个线程可以针对某个数据进行处理&#xff0c;但是10个数据是可以由10个…...

Cell:如何升华你的单细胞数据——PCF空间单细胞蛋白组联合scRNA-seq解析骨髓微环境

骨髓微环境非常复杂&#xff0c;含有不同的细胞类型&#xff0c;包括了造血、间充质、内皮、血管平滑肌和神经谱系细胞等。非造血细胞对于骨髓造血非常关键。然而&#xff0c;这些细胞在人骨髓中的异质性和空间定位在很大程度上仍未被表征。来自佩雷尔曼医学院的研究者使用scRN…...

vue强制刷新组件

在Vue中强制刷新一个组件&#xff0c;通常不是一个推荐的做法&#xff0c;因为Vue的响应式系统设计就是为了自动处理依赖的更新。要强制重新渲染组件&#xff0c;以下是几种方法&#xff1a; 使用key属性&#xff1a; 最常见的方法是改变组件的key属性。当key发生变化时&#x…...

分享5款对工作学习有帮助的效率软件

​ 今天再来推荐5个超级好用的效率软件&#xff0c;无论是对你的学习还是办公都能有所帮助&#xff0c;每个都堪称神器中的神器&#xff0c;用完后觉得不好用你找我。 1.文件复制——ClipClip ​ ClipClip是一款功能强大、操作简便的文件复制与管理软件。它改变了传统的复制粘…...

redis秒杀(PHP版本)

前提提要 今天产品端提了个需求&#xff0c;院校组要求借调我去帮忙&#xff0c;因为我以前做过商城&#xff0c;现在他们需求做一个积分商城&#xff0c;需要做一个秒杀模块&#xff0c;结果毫无意外的我被借调过去了&#xff0c;刚好可以复习一下以前的知识&#xff0c;现在介…...

图形用户界面(GUI)在AI去衣技术中的作用与重要性

引言&#xff1a; 随着人工智能技术的不断进步&#xff0c;AI去衣这一概念逐渐进入公众视野。它指的是利用深度学习算法&#xff0c;从图片或视频中自动移除人物的衣物&#xff0c;生成相应的“裸体”图像。尽管这项技术在道德和隐私方面引发了诸多争议&#xff0c;但其背后的技…...

如何阅读:一个已被证实的低投入高回报的学习方法的笔记

系列文章目录 如何有效阅读一本书笔记 如何阅读&#xff1a;一个已被证实的低投入高回报的学习方法 麦肯锡精英高效阅读法笔记 读懂一本书笔记 文章目录 系列文章目录第一章 扫清阅读障碍破解读不快、读不进去的谜题一切为了阅读小学教师让你做&#xff0c;但中学老师阻止你做的…...

pycharm 安装“通义灵码“并测试

过程&#xff1a;“File>setting>Plugins” 提示&#xff1a; 翻译之后&#xff1a; 点击"接受"之后&#xff0c;提示一下图片&#xff0c;点击ok 安装完成&#xff1a; 安装完"通义灵码"之后&#xff0c;需要登陆&#xff0c;登陆后测试 参考…...

React 之 useMemo Hook (九)

useMemo 是 React 的一个Hook&#xff0c;它允许你“记住”一些计算值&#xff0c;只有在依赖项之一发生变化时才会重新计算这些值。这有助于避免不必要的重新计算和渲染&#xff0c;从而提高应用程序的性能。 代码栗子&#xff08;计算一个斐波那契数列的值&#xff09;&#…...

短视频矩阵系统源码saas开发--可视化剪辑、矩阵托管、多功能合一开发

短视频矩阵系统源码saas开发&#xff08;可视化剪辑、矩阵托管、智能私信聚合、线索转化、数据看板、seo关键词、子账号等多个板块开发&#xff09; 短视频矩阵系统是一种集成了多种功能的系统&#xff0c;旨在帮助用户在短视频平台上进行高效的内容创作、管理和发布。根据您提…...

百度大模型文心一言api 请求错误码 一览表

错误码说明 千帆大模型平台API包含两类&#xff0c;分别为大模型能力API和大模型平台管控API&#xff0c;具体细分如下&#xff1a; 大模型能力API 对话Chat续写Completions向量Embeddings图像Images 大模型平台管控API 模型管理Prompt工程服务管理模型精调数据管理TPM&RP…...

Unity调用智谱API(简单操作 文本实时翻译)

代码展示&#xff1a; using Newtonsoft.Json; using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Networking; using UnityEngine.UI;public class ZhiPuAi : MonoBehaviour {// API的端点URLpublic string…...

Android 开机启动扫描SD卡apk流程源码分析

在开机的时候&#xff0c;装在SD卡的apk和装在系统盘的apk扫描过程不一样&#xff0c;系统盘apk在系统启动过程中扫描&#xff0c;而SD卡上的就不是&#xff0c;等系统启动好了才挂载、扫描&#xff0c;下面就说下SD扫描的流程&#xff1a; 在SystemServer启动MountService&am…...

如何恢复回收站中被删除的文件?3个恢复策略,实测有用!

“刚刚一不小心把回收站清空了&#xff0c;大家有什么好用的方法可以帮我恢复回收站中删除的文件吗&#xff1f;快帮帮我吧&#xff01;” 在使用电脑的过程中&#xff0c;我们有时可能会不小心将重要的文件或文件夹删除到回收站&#xff0c;并且随后可能进一步从回收站中彻底删…...

Unity---版本控制软件

13.3 版本控制——Git-1_哔哩哔哩_bilibili Git用的比较多 Git 常用Linux命令 pwd&#xff1a;显示当前所在路径 ls&#xff1a;显示当前路径下的所有文件 tab键自动补全 cd&#xff1a;切换路径 mkdir&#xff1a;在当前路径下创建一个文件夹 clear&#xff1a;清屏 vim…...

基于大模型的idea提炼:围绕论文和引用提炼idea之ResearchAgent

前言 对本博客比较熟悉的朋友知道&#xff0c;我司论文项目组正在基于大模型做论文的审稿(含CS英文论文审稿、和金融中文论文审稿)、翻译&#xff0c;且除了审稿翻译之外&#xff0c;我们还将继续做润色/修订、idea提炼(包含论文检索)&#xff0c;是一个大的系统&#xff0c;包…...

前端深度扩展

1 为什么要有webpack 模块化管理&#xff1a;构建工具支持Common JS、ES6模块等规范&#xff1b;依赖管理&#xff1a;在大型项目中&#xff0c;手动管理文件依赖关系。webpack可以自动分析项目中的依赖关系&#xff0c;将其打包成1个或多个优化过的文件&#xff0c;减少页面加…...

雷军-2022.8小米创业思考-6-互联网七字诀之专注:有所为,有所不为;克制贪婪,少就是多;一次解决一个最迫切的需求

第六章 互联网七字诀 专注、极致、口碑、快&#xff0c;这就是我总结的互联网七字诀&#xff0c;也是我对互联网思维的高度概括。 专注 从商业角度看&#xff0c;专注就是要“把鸡蛋尽量放在一个篮子里”。这听起来似乎有些不合理&#xff0c;大家的第一反应可能是“风险会不会…...

【禅道客户案例】北大软件携手禅道,开启产品化之路新征程

在项目制项目模式下&#xff0c;软件公司根据客户的需求进行短期项目开发&#xff0c;具有灵活、高效、受众面广的优点&#xff0c;在业界得到了广泛的应用。但这种模式也面临诸多挑战&#xff0c;软件公司需要不断地开发新项目来维持业务增长&#xff0c;由于没有自己的产品也…...

解释泛型(Generics)在Java中的用途

在Java中&#xff0c;泛型&#xff08;Generics&#xff09;是一种在编译时期提供类型检查和约束的机制&#xff0c;它使得类和接口可以被参数化&#xff0c;即你可以定义一个类或接口&#xff0c;并通过参数传入具体的类型。泛型增加了代码的复用性和类型安全性&#xff0c;同…...

iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版​分享

平时用 iPhone 的时候&#xff0c;难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵&#xff0c;或者买了二手 iPhone 却被原来的 iCloud 账号锁住&#xff0c;这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...

2025盘古石杯决赛【手机取证】

前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来&#xff0c;实在找不到&#xff0c;希望有大佬教一下我。 还有就会议时间&#xff0c;我感觉不是图片时间&#xff0c;因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...

深度学习习题2

1.如果增加神经网络的宽度&#xff0c;精确度会增加到一个特定阈值后&#xff0c;便开始降低。造成这一现象的可能原因是什么&#xff1f; A、即使增加卷积核的数量&#xff0c;只有少部分的核会被用作预测 B、当卷积核数量增加时&#xff0c;神经网络的预测能力会降低 C、当卷…...

从“安全密码”到测试体系:Gitee Test 赋能关键领域软件质量保障

关键领域软件测试的"安全密码"&#xff1a;Gitee Test如何破解行业痛点 在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的"神经中枢"。从国防军工到能源电力&#xff0c;从金融交易到交通管控&#xff0c;这些关乎国计民生的关键领域…...

uniapp 集成腾讯云 IM 富媒体消息(地理位置/文件)

UniApp 集成腾讯云 IM 富媒体消息全攻略&#xff08;地理位置/文件&#xff09; 一、功能实现原理 腾讯云 IM 通过 消息扩展机制 支持富媒体类型&#xff0c;核心实现方式&#xff1a; 标准消息类型&#xff1a;直接使用 SDK 内置类型&#xff08;文件、图片等&#xff09;自…...

负载均衡器》》LVS、Nginx、HAproxy 区别

虚拟主机 先4&#xff0c;后7...

Linux基础开发工具——vim工具

文章目录 vim工具什么是vimvim的多模式和使用vim的基础模式vim的三种基础模式三种模式的初步了解 常用模式的详细讲解插入模式命令模式模式转化光标的移动文本的编辑 底行模式替换模式视图模式总结 使用vim的小技巧vim的配置(了解) vim工具 本文章仍然是继续讲解Linux系统下的…...

Git 命令全流程总结

以下是从初始化到版本控制、查看记录、撤回操作的 Git 命令全流程总结&#xff0c;按操作场景分类整理&#xff1a; 一、初始化与基础操作 操作命令初始化仓库git init添加所有文件到暂存区git add .提交到本地仓库git commit -m "提交描述"首次提交需配置身份git c…...

Docker环境下安装 Elasticsearch + IK 分词器 + Pinyin插件 + Kibana(适配7.10.1)

做RAG自己打算使用esmilvus自己开发一个&#xff0c;安装时好像网上没有比较新的安装方法&#xff0c;然后找了个旧的方法对应试试&#xff1a; &#x1f680; 本文将手把手教你在 Docker 环境中部署 Elasticsearch 7.10.1 IK分词器 拼音插件 Kibana&#xff0c;适配中文搜索…...

AWSLambda之设置时区

目标 希望Lambda运行的时区是东八区。 解决 只需要设置lambda的环境变量TZ为东八区时区即可&#xff0c;即Asia/Shanghai。 参考 使用 Lambda 环境变量...