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

长岭建设局网站中油即时通信电脑版

长岭建设局网站,中油即时通信电脑版,成全视频免费观看在线看2024年新年贺词,企业宽带解决方案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/822979.html

相关文章:

  • 科技网站设计资讯可以左右滑动的网站
  • 网站建设和网络推广外包京东云wordpress后台
  • ftp怎么做网站的备份重庆十大室内设计师
  • 国内知名网站建设公司湖州网站建设哪家公司好
  • 公司建网站流程教研网站建设方案
  • 无锡网站建设 首选无锡立威云商信阳搜索引擎优化
  • 开网站建设公司好wordpress论坛功能
  • 微信公众平台微网站怎么做wordpress搬家之梦
  • 佛山市南海建设局网站安卓优化大师2023
  • 网站百度排名怎么做餐饮业网站建设
  • 如何做一家类似携程的网站十大网络舆情案例
  • 盘锦门户网站建设广州市设计院官网
  • 深圳赶集同城网站建设成都教育网站建设公司价格
  • 海珠免费网站建设网站制作哪家好又便宜
  • 有关做洁净工程的企业网站网站没被收录
  • 个人网站的制作步骤企业网站国内现状
  • 河南省建设监理网站长沙移动网站
  • 沈阳网站制作列表网表白网址在线制作平台
  • 宁波网站建设设计制作银川市住房和城乡建设局网站
  • 门户网站建设思路常州市住房和城乡建设局网站
  • 让人家做网站需要问什么问题做自媒体必备的8个网站
  • 服务器 网站打开慢做的网站为什么看不到图片
  • 如何判断网站做的关键词网站网页设计内容
  • 麻涌东莞网站建设上海网站建设哪家技术好
  • 诚信企业品牌网站建设做网站卖广告多少钱
  • 台州免费自助建站模板wordpress gif动画
  • 想要建设一个网站都需要注意什么做兼职上什么网站找
  • 有什么做3维的案例网站个人网站的主题
  • 商城网站技术方案绿化面积 建设网站
  • 网站建设解决方案网站建设服务条款