当前位置: 首页 > 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/811220.html

相关文章:

  • 网络营销软件站拓者设计吧室内设计官网登录
  • 临安建设投标网站网站建设和电子商务的关系
  • 电子商务网站建设选择题建设个直播网站要多少钱
  • 泰兴企业网站建设迁移wordpress到阿里云
  • 西安做网站的公司排名住房和城乡建设部官网
  • 公司网站在哪里做深圳微网站开发
  • 网站建设属于技术开发合同吗这么制作自己的网站
  • 北京恒伟网站建设网站权重是怎么提升的
  • 如何搭建一个属于自己的网站化学网站建设
  • 旅游网站建设的方向做外贸一般上什么网站
  • 档案网站建设论文网站中加入地图
  • wordpress 在浏览站点时显示工具栏关于加强网站建设
  • 做苗木行业网站赚钱国外无版权图片网站
  • 网站过期了怎么办微信商城定制
  • 跨境网站建设wordpress哪个php版本好
  • 郑州市汉狮做网站帮忙卖货的平台
  • 做3d效果图有什么好网站网站架构设计师面试技巧
  • 国外seo比较好的博客网站新手自学网站
  • 咸宁网站建设公司建设单位经常去哪个网站
  • 廉洁文化网站建设方案重庆巴南网站制作
  • 南宁网站开发建设无锡网站定制
  • 连云港网站建设的公司微信高端网站建设
  • 自己建立公司网站如何提高网站加载速度慢
  • 快速搭建网站 数据存储备案通过后 添加网站
  • 手表网站查询大丰专业做网站的公司
  • 品牌推广的方式有哪些公司seo是什么
  • 红色扁平化网站查企业的app软件有哪些
  • 广州网道营销广告有限公司抖音seo查询工具
  • 网站建设高手要学多久建设多语种网站
  • 北京网站建设浩森宇特网站建设应该列入什么科目