当前位置: 首页 > 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;同…...

现代密码学 | 椭圆曲线密码学—附py代码

Elliptic Curve Cryptography 椭圆曲线密码学&#xff08;ECC&#xff09;是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础&#xff0c;例如椭圆曲线数字签…...

今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存

文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...

html-<abbr> 缩写或首字母缩略词

定义与作用 <abbr> 标签用于表示缩写或首字母缩略词&#xff0c;它可以帮助用户更好地理解缩写的含义&#xff0c;尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时&#xff0c;会显示一个提示框。 示例&#x…...

Java 二维码

Java 二维码 **技术&#xff1a;**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...

【Java学习笔记】BigInteger 和 BigDecimal 类

BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点&#xff1a;传参类型必须是类对象 一、BigInteger 1. 作用&#xff1a;适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...

免费PDF转图片工具

免费PDF转图片工具 一款简单易用的PDF转图片工具&#xff0c;可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件&#xff0c;也不需要在线上传文件&#xff0c;保护您的隐私。 工具截图 主要特点 &#x1f680; 快速转换&#xff1a;本地转换&#xff0c;无需等待上…...

【Android】Android 开发 ADB 常用指令

查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...

如何应对敏捷转型中的团队阻力

应对敏捷转型中的团队阻力需要明确沟通敏捷转型目的、提升团队参与感、提供充分的培训与支持、逐步推进敏捷实践、建立清晰的奖励和反馈机制。其中&#xff0c;明确沟通敏捷转型目的尤为关键&#xff0c;团队成员只有清晰理解转型背后的原因和利益&#xff0c;才能降低对变化的…...

Python网页自动化Selenium中文文档

1. 安装 1.1. 安装 Selenium Python bindings 提供了一个简单的API&#xff0c;让你使用Selenium WebDriver来编写功能/校验测试。 通过Selenium Python的API&#xff0c;你可以非常直观的使用Selenium WebDriver的所有功能。 Selenium Python bindings 使用非常简洁方便的A…...

云安全与网络安全:核心区别与协同作用解析

在数字化转型的浪潮中&#xff0c;云安全与网络安全作为信息安全的两大支柱&#xff0c;常被混淆但本质不同。本文将从概念、责任分工、技术手段、威胁类型等维度深入解析两者的差异&#xff0c;并探讨它们的协同作用。 一、核心区别 定义与范围 网络安全&#xff1a;聚焦于保…...