当前位置: 首页 > 科技观察

C++多线程编程中的多线程数据共享问题

时间:2023-03-13 06:46:54 科技观察

通过容器创建多线程#include#include#includevoidprintTest(intnum){std::cout<<"sub-thread:"<test;for(inti=0;i<10;i++){test.push_back(newstd::thread(printTest,i));}for(auto&pmove:test){pmove->join();}std::cout<<"mainthread"<#include#includestd::vectorg_data={1,2,3};voidprintTest(intnum){std::cout<<"子线程:"<测试;for(inti=0;i<10;i++){test.push_back(newstd::thread(printTest,i));}for(auto&pmove:test){pmove->join();}std::cout<<"mainthread"<#include#includeclassSeaKing{public:voidmakeFriend(){for(inti=0;i<100000;i++){std::cout<<"添加一个"<mm;};intmain(){SeaKingman;std::threadt1(&SeaKing::makeFriend,&man);std::threadt2(&SeaKing::breakUp,&man);t1.join();t2.join();return0;}//以上程序会异常退出,通过加锁解决数据共享问题函数lock函数通过调用成员函数unlock进行加锁和解锁#include#include#include#include//1.包含头文件classSeaKing{public:voidmakeFriend(){for(inti=0;i<100000;i++){m_mutex.lock();std::cout<<"加一个"<mm;std::mutexm_mutex;//创建互斥锁对象};intmain(){SeaKingman;std::threadt1(&SeaKing::makeFriend,&man);std::threadt2(&SeaKing::breakUp,&man);t1.join();t2.join();return0;}注意:lock函数和unlock成对出现,如果lock没有的话调用unlock,会抛出异常,abort终止程序,通过lock_guard加锁#include#include#include#includeclassSeaKing{public:voidmakeFriend(){std::lock_guardsbguard(m_mutex);for(inti=0;i<100000;i++){std::cout<<"加一个"<sbguard(m_mutex);if(!mm.empty()){std::cout<<"减少一个:"<mm;std::mutexm_mutex;};intmain(){SeaKingman;std::threadt1(&SeaKing::makeFriend,&man);std::threadt2(&SeaKing::breakUp,&man);t1.join();t2.join();return0;}其实lock_guard在构造函数中进行lock,在析构函数中进行unlock,本质上是加锁和解锁操作。