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

都江堰网站建设公司小学生做网站步骤

都江堰网站建设公司,小学生做网站步骤,网站开发算不算软件企业,网络营销和网上销售的区别c多线程实现使用标准库中的<thread>,一下代码描述多线程实现方式 &#xff0c;最简单的线程创建方式是通过传递一个可调用对象&#xff08;如函数指针、函数对象或 Lambda 表达式&#xff09; 48.1 线程创建与使用 以下代码展示通过传递lambda表达式和函数指针给线程对象…

c++多线程实现使用标准库中的<thread>,一下代码描述多线程实现方式 ,最简单的线程创建方式是通过传递一个可调用对象(如函数指针、函数对象或 Lambda 表达式)

48.1 线程创建与使用

 以下代码展示通过传递lambda表达式和函数指针给线程对象的方式,线程对象worker一直打印working直到控制台按下enter建结束。

//
//  main.cpp
//  HelloWorld
//
//  Created by lxr on 2024/11/28.
//#include <iostream>
#include <vector>
#include <thread>
static bool ifFinished = false;
void doWork()
{using namespace std::literals::chrono_literals;std::cout<<"start thread id="<<std::this_thread::get_id()<<std::endl;while (!ifFinished) {std::cout<<"working.."<<std::endl;std::this_thread::sleep_for(1s);}
}
int main(int argc, const char * argv[]) {// insert code here...//lambda表达式给线程传递对象std::thread th([](int a){std::cout<<"lambda thread"<<std::endl;});//函数指针给线程传递对象std::thread worker(doWork);std::cin.get();ifFinished = true;worker.join();//类似其他语言中的wait,等待worker子线程结束后才继续后续代码std::cout<<"finished"<<std::endl;std::cout<<"start thread id="<<std::this_thread::get_id()<<std::endl;std::cin.get();
}

 

48.2 线程生命周期

std::thread在其对象超出作用域时会自动销毁,如果线程对象没有显示的调用join或detach,则程序会有异常,导致程序终止:

void create_thread() {std::thread t([]() { std::cout << "Hello from thread!" << std::endl; });// 这里没有调用 t.join() 或 t.detach(),会导致程序终止
}
int main(int argc, const char * argv[]) {create_thread();
}

 

join()

  • join() 方法用于等待线程完成。如果你在主线程中调用 join(),则主线程会暂停执行,直到目标线程执行完毕。
  • 调用 join() 是线程生命周期的正确结束方式,确保线程资源得到了适当的清理

detach()

  • detach() 方法用于将线程与当前执行流分离。这意味着线程将会在后台继续执行,且主线程不会等待它完成。被分离的线程将会在完成后自动清理资源。
  • 要确保分离的线程没有在主线程结束之前完成执行

 为了避免异常,应该始终在使用完线程后,显式地调用 join()detach()

48.3 互斥

 多线程并发时,要处理资源竞争的问题,为了确保共享资源数据的准确性,需要给线程加锁:

#include <iostream>
#include <thread>
#include <mutex>
#include <vector>std::mutex mtx;  // 互斥锁
int counter = 0;void threadFunction(int threadID) {std::lock_guard<std::mutex> guard(mtx);  // 自动加锁std::cout << "threadID:" << threadID << " counter:" << counter++ << " id:" << std::this_thread::get_id() << std::endl;
}int main() {std::vector<std::thread> threads;for (int i = 0; i < 100; ++i){threads.emplace_back(threadFunction, i);}for (int i = 0; i < threads.size(); ++i){threads.at(i).join();}std::cout << "final counter: " << counter << std::endl;return 0;
}

加锁后的共享资源counter会依次递增,数据准确 

 

 将加锁代码std::lock_guard<std::mutex> guard(mtx);注释后发现counter增加混乱,数据准确性会被破坏

此外还可以使用std::unique_lock<std::mutex> lock(mtx);进行加锁,可以灵活加锁和解锁,但开销较大,在一般情况下优先使用std::lock_guard

http://www.dtcms.com/wzjs/560160.html

相关文章:

  • ps切片做网站网站开发技术及特点
  • 广西城乡和住房建设厅网站首页长沙网站排名报价
  • 凡科免费建站平台手机wap版
  • 如何查看一个网站做的外链高权重网站出售
  • 28网站制作外贸网站建设入门
  • 建设工程质量监理协会网站电商网站设计说明书
  • 如何安装网站模版网页版游戏排行榜田田田田田田田田
  • cnzz 网站跳出率查询网站八个
  • 网站建成后应该如何推广少儿编程加盟品牌排行榜
  • 学做招投标的网站有哪些建筑公司招聘岗位
  • 商品网站建设实验格式网站建设的程序
  • 湖北省建设主管网站地推公司
  • 网站开发私人培训网站建设南沙
  • 常德网站建设网站优化壹淘购返利网
  • 做类似于彩票的网站犯法吗自己建的网站打不开
  • 本地网站模板修改制作网页和做网站是一个意思吗
  • 手把手教你入侵网站修改数据地板网站模板免费下载
  • 长春网站建设设计公司门户网站制作
  • 淄博网站建设yx718网站哪些付款二维码是怎么做的
  • 平面毕业设计作品网站网站开发人员的岗位有
  • 东坑仿做网站网站外网怎么做
  • 网站建设维护和服务合同为什么说做网站赚钱
  • 网站静态和动态区别是什么意思工程建设规范
  • 现在大家做电商网站用什么源码网站建设工具公司
  • 百度网站禁止访问怎么解除专业的医疗行业网站模板
  • 网络服务平台有哪些seo搜索引擎优化方法
  • 菏泽炫佑网站建设网站开发框架文档
  • 电子政务门户网站建设方案婚纱摄影平台
  • 网站建设富库大连建设工程信息网官网查询
  • 简述建设一个网站的具体过程社科联网站建设方案策划书