c++ 线程交叉场景试验
1.需求
- 处理一个列表的数据,要求按照列表的数据处理10个数据
- 可以使用多线程处理,但是针对每个线程,1~10的处理顺序不能变。
- 每个数据的处理必须原子,即只有一个线程可以针对某个数据进行处理,但是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.需求 处理一个列表的数据,要求按照列表的数据处理10个数据可以使用多线程处理,但是针对每个线程,1~10的处理顺序不能变。每个数据的处理必须原子,即只有一个线程可以针对某个数据进行处理,但是10个数据是可以由10个…...
Cell:如何升华你的单细胞数据——PCF空间单细胞蛋白组联合scRNA-seq解析骨髓微环境
骨髓微环境非常复杂,含有不同的细胞类型,包括了造血、间充质、内皮、血管平滑肌和神经谱系细胞等。非造血细胞对于骨髓造血非常关键。然而,这些细胞在人骨髓中的异质性和空间定位在很大程度上仍未被表征。来自佩雷尔曼医学院的研究者使用scRN…...
vue强制刷新组件
在Vue中强制刷新一个组件,通常不是一个推荐的做法,因为Vue的响应式系统设计就是为了自动处理依赖的更新。要强制重新渲染组件,以下是几种方法: 使用key属性: 最常见的方法是改变组件的key属性。当key发生变化时&#x…...
分享5款对工作学习有帮助的效率软件
今天再来推荐5个超级好用的效率软件,无论是对你的学习还是办公都能有所帮助,每个都堪称神器中的神器,用完后觉得不好用你找我。 1.文件复制——ClipClip ClipClip是一款功能强大、操作简便的文件复制与管理软件。它改变了传统的复制粘…...
redis秒杀(PHP版本)
前提提要 今天产品端提了个需求,院校组要求借调我去帮忙,因为我以前做过商城,现在他们需求做一个积分商城,需要做一个秒杀模块,结果毫无意外的我被借调过去了,刚好可以复习一下以前的知识,现在介…...
图形用户界面(GUI)在AI去衣技术中的作用与重要性
引言: 随着人工智能技术的不断进步,AI去衣这一概念逐渐进入公众视野。它指的是利用深度学习算法,从图片或视频中自动移除人物的衣物,生成相应的“裸体”图像。尽管这项技术在道德和隐私方面引发了诸多争议,但其背后的技…...
如何阅读:一个已被证实的低投入高回报的学习方法的笔记
系列文章目录 如何有效阅读一本书笔记 如何阅读:一个已被证实的低投入高回报的学习方法 麦肯锡精英高效阅读法笔记 读懂一本书笔记 文章目录 系列文章目录第一章 扫清阅读障碍破解读不快、读不进去的谜题一切为了阅读小学教师让你做,但中学老师阻止你做的…...
pycharm 安装“通义灵码“并测试
过程:“File>setting>Plugins” 提示: 翻译之后: 点击"接受"之后,提示一下图片,点击ok 安装完成: 安装完"通义灵码"之后,需要登陆,登陆后测试 参考…...
React 之 useMemo Hook (九)
useMemo 是 React 的一个Hook,它允许你“记住”一些计算值,只有在依赖项之一发生变化时才会重新计算这些值。这有助于避免不必要的重新计算和渲染,从而提高应用程序的性能。 代码栗子(计算一个斐波那契数列的值)&#…...
短视频矩阵系统源码saas开发--可视化剪辑、矩阵托管、多功能合一开发
短视频矩阵系统源码saas开发(可视化剪辑、矩阵托管、智能私信聚合、线索转化、数据看板、seo关键词、子账号等多个板块开发) 短视频矩阵系统是一种集成了多种功能的系统,旨在帮助用户在短视频平台上进行高效的内容创作、管理和发布。根据您提…...
百度大模型文心一言api 请求错误码 一览表
错误码说明 千帆大模型平台API包含两类,分别为大模型能力API和大模型平台管控API,具体细分如下: 大模型能力API 对话Chat续写Completions向量Embeddings图像Images 大模型平台管控API 模型管理Prompt工程服务管理模型精调数据管理TPM&RP…...
Unity调用智谱API(简单操作 文本实时翻译)
代码展示: 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流程源码分析
在开机的时候,装在SD卡的apk和装在系统盘的apk扫描过程不一样,系统盘apk在系统启动过程中扫描,而SD卡上的就不是,等系统启动好了才挂载、扫描,下面就说下SD扫描的流程: 在SystemServer启动MountService&am…...
如何恢复回收站中被删除的文件?3个恢复策略,实测有用!
“刚刚一不小心把回收站清空了,大家有什么好用的方法可以帮我恢复回收站中删除的文件吗?快帮帮我吧!” 在使用电脑的过程中,我们有时可能会不小心将重要的文件或文件夹删除到回收站,并且随后可能进一步从回收站中彻底删…...
Unity---版本控制软件
13.3 版本控制——Git-1_哔哩哔哩_bilibili Git用的比较多 Git 常用Linux命令 pwd:显示当前所在路径 ls:显示当前路径下的所有文件 tab键自动补全 cd:切换路径 mkdir:在当前路径下创建一个文件夹 clear:清屏 vim…...
基于大模型的idea提炼:围绕论文和引用提炼idea之ResearchAgent
前言 对本博客比较熟悉的朋友知道,我司论文项目组正在基于大模型做论文的审稿(含CS英文论文审稿、和金融中文论文审稿)、翻译,且除了审稿翻译之外,我们还将继续做润色/修订、idea提炼(包含论文检索),是一个大的系统,包…...
前端深度扩展
1 为什么要有webpack 模块化管理:构建工具支持Common JS、ES6模块等规范;依赖管理:在大型项目中,手动管理文件依赖关系。webpack可以自动分析项目中的依赖关系,将其打包成1个或多个优化过的文件,减少页面加…...
雷军-2022.8小米创业思考-6-互联网七字诀之专注:有所为,有所不为;克制贪婪,少就是多;一次解决一个最迫切的需求
第六章 互联网七字诀 专注、极致、口碑、快,这就是我总结的互联网七字诀,也是我对互联网思维的高度概括。 专注 从商业角度看,专注就是要“把鸡蛋尽量放在一个篮子里”。这听起来似乎有些不合理,大家的第一反应可能是“风险会不会…...
【禅道客户案例】北大软件携手禅道,开启产品化之路新征程
在项目制项目模式下,软件公司根据客户的需求进行短期项目开发,具有灵活、高效、受众面广的优点,在业界得到了广泛的应用。但这种模式也面临诸多挑战,软件公司需要不断地开发新项目来维持业务增长,由于没有自己的产品也…...
解释泛型(Generics)在Java中的用途
在Java中,泛型(Generics)是一种在编译时期提供类型检查和约束的机制,它使得类和接口可以被参数化,即你可以定义一个类或接口,并通过参数传入具体的类型。泛型增加了代码的复用性和类型安全性,同…...
【Perplexity心理健康资源权威指南】:20年临床IT专家亲测的5大高隐蔽性心理支持工具揭秘
更多请点击: https://codechina.net 第一章:Perplexity心理健康资源的临床价值与技术定位 Perplexity 作为一款基于大语言模型的实时信息检索与推理引擎,其在心理健康领域并非直接提供诊疗服务,而是通过增强临床决策支持、辅助心…...
go 链表 (标准库实现)
Go 链表简介Go 标准库里没有单链表,只在 container/list 包里提供了双向循环链表。两个核心类型list.List :链表本身,包含哨兵节点和长度 list.Element :链表节点,存数据 前后指针 type Element struct {Value interf…...
10大好用WMS系统盘点!2026年企业WMS系统选型实战指南
在2026年企业数字化转型的浪潮中,WMS系统(仓储管理系统)已经成为提升供应链效率的核心工具。面对市面上琳琅满目的WMS系统,企业如何进行精准的WMS系统选型,成为了管理者面临的一大难题。为了帮助大家避坑,本…...
国内用户怎么注册.ai域名?2026最新AI域名注册规则+平台推荐
随着人工智能(AI)行业的持续爆发,越来越多企业在搭建官网时,开始优先选择 .ai域名。 你会发现一个明显变化: 👉 很多AI工具、AI平台,直接使用“.ai”作为网站后缀 这背后的原因,其…...
一文读懂现代城市照明:从亮化到数字化的行业升级指南
当前照明行业早已脱离单纯"亮起来"的初级阶段,正在向场景化、数字化、低碳化方向快速迭代,很多客户在选择照明服务商时往往对行业标准、技术趋势了解不足,导致项目效果与预期存在差距。行业升级的核心方向:从单一照明到…...
嵌入式学习的第八天
字符指针常见错误 核心:字符串常量存只读内存,不可修改! #include <stdio.h> int main() {// 错误写法:指针指向字符串常量(只读),不能修改内容char *p "hello"; // *(p0) e…...
【软考高级架构】案例题考前突击19——微服务架构下的服务注册发现与熔断限流机制设计
案例分析题:微服务架构下的服务注册发现与熔断限流机制设计 案例背景 B公司开发了一套大型电商系统,采用Spring Cloud微服务架构实现商品管理、订单管理、支付服务、用户服务、搜索推荐等多个服务模块。系统部署在Kubernetes平台上,采用Eureka作为服务注册中心,Ribbon和F…...
OBS遮罩插件深度指南:15种特效解决直播画面优化的5大痛点
OBS遮罩插件深度指南:15种特效解决直播画面优化的5大痛点 【免费下载链接】obs-advanced-masks Advanced Masking Plugin for OBS 项目地址: https://gitcode.com/gh_mirrors/ob/obs-advanced-masks OBS高级遮罩插件(OBS Advanced Masksÿ…...
51单片机计算器DIY:除了加减乘除,你的LCD1602和矩阵键盘还能这样玩?
51单片机计算器进阶指南:解锁LCD1602与矩阵键盘的隐藏玩法 当你在51单片机上成功实现了一个基础计算器后,是否想过这两个核心外设——LCD1602液晶屏和4x4矩阵键盘——还能玩出什么新花样?本文将带你超越简单的加减乘除,探索硬件模…...
长期使用聚合API平台,对账单清晰度与费用追溯的满意度反馈
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 长期使用聚合API平台,对账单清晰度与费用追溯的满意度反馈 作为一名长期负责项目维护的开发者,我所在团队在…...
