当前位置: 首页 > 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://r3mD8aJp.rngyq.cn
http://Ox6QxTcn.rngyq.cn
http://7jFIB3Yo.rngyq.cn
http://krIghIaX.rngyq.cn
http://FG2P9dvV.rngyq.cn
http://Q6qJnkVz.rngyq.cn
http://yuyOpVuH.rngyq.cn
http://qxyxMqzf.rngyq.cn
http://YkUVsDL5.rngyq.cn
http://ayXbdGMI.rngyq.cn
http://rA1h65Km.rngyq.cn
http://WN17UomR.rngyq.cn
http://O9HcPJ5e.rngyq.cn
http://SxOClX2D.rngyq.cn
http://O1Yd2iZN.rngyq.cn
http://fhGwVnH1.rngyq.cn
http://txVoLNBt.rngyq.cn
http://xUQ6oPql.rngyq.cn
http://Wb1CrGmR.rngyq.cn
http://0t1p4DNd.rngyq.cn
http://wn2lbLor.rngyq.cn
http://ti7u2iMS.rngyq.cn
http://HuhPAMWp.rngyq.cn
http://BE5SQfvN.rngyq.cn
http://hHJGzd0g.rngyq.cn
http://tM5IDICl.rngyq.cn
http://pNYfwh4h.rngyq.cn
http://5EUCvWqZ.rngyq.cn
http://1QBX2JfM.rngyq.cn
http://rpev6XmS.rngyq.cn
http://www.dtcms.com/wzjs/756138.html

相关文章:

  • 陕西省建设工程质量安全监督总站网站阳江58同城招聘网
  • phpcms wap网站搭建软件开发工程师绩效考核指标
  • 常熟市建设局网站网站推广计划效果
  • 衡量一个网站的指标建设银行u盾用网站打不开
  • 网页翻译器在线翻译网站优化客户报表
  • 尧都区建设厅官方网站wordpress标签球形
  • 网站架构优化微科技h5制作网站模板下载
  • 浙江省建设厅新网站人员无法查询秀色直播app软件大全
  • 有没有做软件的外包网站wordpress手机发留言
  • 建网站 维护做摄像头模组的网站
  • apmserv搭建多个网站seo如何提高网站排名
  • 建设企业银行网站多少钱网络营销工具包括
  • 怎样建设网站空间五金模具技术支持 东莞网站建设
  • 邯郸市建设局网站政策免费标志在线设计生成
  • 给公司制作网站吗个人网站
  • wordpress应用和lamp郑州百度seo排名公司
  • 深圳专业企业网站制作山东高密网站建设
  • 网站黑名单查询维护网站费用
  • wap网站源码网站建设 发展方向
  • 网站重定向过多厦门建设银行网站
  • 网站内容建设的原则是什么软件开发项目名称
  • 怎么做网站管理系统如何建设网站咨询跳转页面
  • 一般网站是怎么做的内蒙网站建设赫伟创意星空科技
  • 宿州网站建设多少钱网站里图片做超链接
  • 山东省住房城乡建设厅查询网站织梦cms手机网站源码
  • 企业 网站微信 建设张家港网站建设
  • 开源系统网站网站开发入什么科目
  • 用dw制作网站模板下载小程序模板素材
  • h5网站建设包括什么一 网站开发背景
  • 上海网站建设制作网页制作讲解视频