尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

C++项目

C++项目 这个项目是我们学校的实训项目便于维护变电站的运维状态STL套接字pthreadC线程/std::pthreadC线程SQLite3小型的二维关系的数据库PostgreSQL类似于mysqllibcurlHTTP请求JjsoncppjsonCMake 类似于mikefile先创建codes文件夹(用于代码存储)让codebuddy 运行完上传代码至gitee在windows上install在管理员终端下winget install Git.Git然后关闭所有终端重启后运行git --version检查上传代码先在gitee中创建仓库//在codes文件夹中 右键打开终端gitgit init//初始化为仓库git status//查看状态git add .//添加到提交缓冲区里git statusgit commit -m “V0版本”git config -lgit remote add origin gitgitee.com等等//添加远程仓库git push -u origin “master”//添加远程仓库//免密ssh-keygen//生成公钥终端上 ls ~/.sshcat ~/.ssh/id(cat ~/.ssh/id.pub)会显示一串公钥粘贴到gitee上即可VS 自定义开发json库创建空项目右键 属性VC目录 的包含目录加上 …\include引入json库的头文件链接器 常规 附加目录 …\lib (指定编译时json.lib连接库的位置)输入 附加依赖项必须添加 json.lib 编译时的依赖项自己的程序 编译后的位置 将json.dll动态连接库(Window程序运行时优先加载本地目录)C的线程基础#include thread 使用 std::thread 创建线程创建线程时可调用对象会立即在新线程中执行线程基础#includeiostreamusingnamespacestd;#includethread#includechrono#includefunctionalintmain(){functionvoid(int,int,bool)task1[](inta,intb,boolstopFlag){for(inti1;iab;i){if(stopFlag)break;if(i%50)coutthis_thread::get_id()aa,bbendl;this_thread::sleep_for(chrono::milliseconds(500));//0.5s}};boolflagfalse;//创建线程 指定线程任务函数同时传入任务函数的实参//thread t(task1, 10, 20);//线程任务函数的参数是引用类型需要使用ref()threadt(bind(task1,10,20,ref(flag)));//ref()告诉编译器 他是个引用//等待线程执行完毕//t.join();t.detach();//将子线程从主线程中分离//手动等待子线程结束this_thread::sleep_for(chrono::seconds(10));//等待10sflagtrue;cout让子线程停止t.get_id()endl;//获取子线程的id通过thread类对象是无法获取子线程的IDthis_thread::sleep_for(chrono::seconds(2));//获取当前线程idcoutthis_thread::get_id()---over---endl;return0;}互斥锁//主线程上锁后 只能在主线程解锁 不能在子线程解锁#includeiostreamusingnamespacestd;#includethread#includechrono#includefunctional#includevector#includectime#includecstdlib//互斥锁#includemutexvoidgenRand(vectorintv){srand(time(nullptr));for(inti0;iv.size();i){v[i]rand()%100;}}#includealgorithmvoidsortVector(vectorintv){sort(v.begin(),v.end());}voidshowTask(vectorintv){for(autox:v){coutx ;}coutendl;}intmain(){vectorintv(10);//10个数//三个线程对同一个容器进行处理threadt1(genRand,ref(v));t1.join();threadt2(sortVector,ref(v));t2.join();threadt3(showTask,ref(v));t3.join();/*t1.detach(); t2.detach(); t3.detach();*///分离后会有冲突问题//this_thread::sleep_for(chrono::seconds(2));cout---over---endl;return0;}#includeiostreamusingnamespacestd;#includethread#includechrono#includefunctional#includevector#includectime#includecstdlib//互斥锁#includemutexmutex m1;//主线程上锁后 只能在主线程解锁 不能在子线程解锁voidaddNums(intret,intn){srand(time(nullptr));for(inti0;in;i){//lock_guardmutexlock(m1);//自动加锁锁离开作用域时会自动解锁//unique_lockmutexlock1(m1);//自动加锁unique_lockmutexlock2(m1,defer_lock);//延迟加锁lock2.lock();intnumrand()%100;coutthis_thread::get_id()生成数numendl;retnum;coutthis_thread::get_id()总和retendl;lock2.unlock();//lock2.lock();//可再次加锁 解锁this_thread::sleep_for(chrono::milliseconds(100));//100ms 0.1s}}intmain(){inttotal0;threadt1(addNums,ref(total),10);threadt2(addNums,ref(total),10);t1.detach();t2.detach();//两个线程无序打印 错落this_thread::sleep_for(chrono::seconds(5));couttotaltotalendl;return0;}条件变量#includeiostreamusingnamespacestd;#includethread#includechrono#includefunctional#includevector#includectime#includecstdlib#includecondition_variablemutex m;condition_variable cv;////条件变量vectorintq;//数据intmax_size10;voidproduct(){while(true){unique_lockmutexlock(m);//先加个锁//条件变量cv.wait(lock,[]{returnq.size()max_size;});//如果满了 则等待q.push_back(rand()%100);coutthis_thread::get_id()生产数据q.back()endl;cv.notify_all();//通知消费者线程this_thread::sleep_for(chrono::milliseconds(100));}}voidconsumer(){while(true){unique_lockmutexlock(m);cv.wait(lock,[]{return!q.empty();});//当前队列是空的 则等待intnumq.front();q.erase(q.begin());coutthis_thread::get_id()消费数据numendl;//this_thread::sleep_for(chrono::milliseconds(100));cv.notify_all();}}intmain(){srand(time(nullptr));threadt1(consumer);threadt2(product);t1.detach();//t2.detach();t2.join();//this_thread::sleep_for(chrono::seconds(10));return0;}
返回列表