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

【C++】C++中的多线程

C++中的多线程

  • 1.相关的类和方法
    • (1)线程的创建-->类名thread
      • 示例代码:
    • (2)互斥锁-->类名mutex
      • 示例代码:
    • (3)条件变量--》类名condition_variable 使用的时候需要跟unique_lock锁配合使用
      • 示例代码:

C++11中诞生C++的多线程类,在编译时需加上 -pthread指定多线程库

1.相关的类和方法

   pthread_create()pthread_join()pthread_mutex_init()

(1)线程的创建–>类名thread

 第一步:创建thread的对象,传递任务函数C++中线程的任务函数
void 函数名(形参列表) //C++对于参数的类型和个数没有限制
{}
thread 对象(任务函数名字,传递给任务函数的参数.........);

示例代码:

#include <iostream>
#include <thread>  //跟多线程有关的头文件using namespace std;/*C++多线程
*/
//任务函数1:参数的类型,个数没有限制
void task1(int n,float m,const char *buf)
{while(1){cout<<"线程1在执行: "<<n<<"  "<<m<<"  "<<buf<<endl;sleep(1);}
}//任务函数2:参数的类型,个数没有限制
void task2()
{while(1){cout<<"线程2在执行"<<endl;sleep(1);}
}int main()
{//创建线程1:thread t1(task1,666,88.8,"测试线程的创建");//创建线程2:thread t2(task2);//回收线程t1.join();t2.join();return 0;
}

(2)互斥锁–>类名mutex

mutex()//构造函数
void lock();          //上锁
void unlock();      //解锁

示例代码:

#include <iostream>
#include <thread>  //跟多线程有关的头文件
#include <mutex>  //互斥锁头文件using namespace std;/*C++多线程
*/int num=0; //商品数量
//定义锁对象
mutex m1;//任务函数1:生产部门
void task1()
{while(1){//上锁m1.lock();num++;cout<<"生产了一个产品,目前数量: "<<num<<endl;sleep(1);//解锁m1.unlock();//延时,防止自己解的锁,自己又上上去了usleep(100);}
}//任务函数2:销售部门
void task2()
{while(1){//上锁m1.lock();num--;cout<<"销售了一个产品,目前数量: "<<num<<endl;sleep(1);//解锁m1.unlock();//延时,防止自己解的锁,自己又上上去了usleep(100);}
}int main()
{//创建线程1:thread t1(task1);//创建线程2:thread t2(task2);//回收线程t1.join();t2.join();return 0;
}

(3)条件变量–》类名condition_variable 使用的时候需要跟unique_lock锁配合使用

//阻塞条件变量--》跟linux中的pthread_cond_wait()一样的作用
void wait (unique_lock<mutex>& lck);
//唤醒条件变量--》跟linux中的pthread_cond_signal()一样的作用
notify_one()

示例代码:

#include <iostream>
#include <thread> //线程的头文件
#include <unistd.h>
#include <mutex>  //锁有关的头文件
#include <condition_variable> //条件变量有关的头文件
using namespace std;/*创建5个线程,模拟售票窗口卖票主函数模拟铁道部,负责放票出来因为C++中的条件变量要求跟unique_lock配合使用(不是跟mutex直接配合使用)unique_lock有个特点:当你创建unique_lock的对象时,会自动上锁
*///定义全局变量用来票的总数
volatile int ticketnum=10;
//定义互斥锁
mutex mymutex;
//定义条件变量
condition_variable myval;//线程任务函数1
void fun1()
{while(1){unique_lock<mutex> ulock(mymutex); //自动上锁ticketnum--;if(ticketnum<=0) //票的数量为0{cout<<"线程1阻塞在wait这里了"<<endl;//阻塞当前线程,暂时停止售票myval.wait(ulock);}sleep(1);cout<<"窗口1卖出一张票,剩下: "<<ticketnum<<"张票"<<endl;ulock.unlock();usleep(500);}
}
//线程任务函数2
void fun2()
{while(1){unique_lock<mutex> ulock(mymutex);ticketnum--;if(ticketnum<=0) //票的数量为0{cout<<"线程2阻塞在wait这里了"<<endl;//阻塞当前线程,暂时停止售票myval.wait(ulock);}sleep(1);cout<<"窗口2卖出一张票,剩下: "<<ticketnum<<"张票"<<endl;ulock.unlock();usleep(500);}
}
//线程任务函数3 
void fun3()
{while(1){unique_lock<mutex> ulock(mymutex);ticketnum--;if(ticketnum<=0) //票的数量为0{cout<<"线程3阻塞在wait这里了"<<endl;//阻塞当前线程,暂时停止售票myval.wait(ulock);}sleep(1);cout<<"窗口3卖出一张票,剩下: "<<ticketnum<<"张票"<<endl;ulock.unlock();usleep(500);}
}
//线程任务函数4 
void fun4()
{while(1){unique_lock<mutex> ulock(mymutex);ticketnum--;if(ticketnum<=0) //票的数量为0{cout<<"线程4阻塞在wait这里了"<<endl;//阻塞当前线程,暂时停止售票myval.wait(ulock);}sleep(1);cout<<"窗口4卖出一张票,剩下: "<<ticketnum<<"张票"<<endl;ulock.unlock();usleep(500);}
}
//线程任务函数5 
void fun5()
{while(1){unique_lock<mutex> ulock(mymutex);ticketnum--;if(ticketnum<=0) //票的数量为0{cout<<"线程5阻塞在wait这里了"<<endl;//阻塞当前线程,暂时停止售票myval.wait(ulock);}sleep(1);cout<<"窗口5卖出一张票,剩下: "<<ticketnum<<"张票"<<endl;ulock.unlock();usleep(500);}
}
int main()
{//创建线程对象thread t1(fun1);thread t2(fun2);thread t3(fun3);thread t4(fun4);thread t5(fun5);//主函数代表铁道部while(1){if(ticketnum<=0){cout<<",票卖完了,放票出来"<<endl;int temp;cin>>temp;ticketnum=temp;//唤醒其中一个线程myval.notify_one();}}//线程回收t1.join();t2.join();t3.join();t4.join();t5.join();return 0;
}
http://www.dtcms.com/a/589023.html

相关文章:

  • Painter AI 材质 x 智能遮罩:告别“风格化”手K地狱
  • 网站建设工作小组推进表陈仓网站建设
  • 自指自洽,人各有色,本分随缘
  • 从芯到云:openEuler 打造的全场景软件生态链
  • 一个域名可以绑定两个网站吗免费字体设计网站
  • 服装设计网站有哪些自适应网站系统吗
  • 动态规划经典题解:单词拆分(LeetCode 139)
  • Softmax 与 Sigmoid:深入理解神经网络中的两类激活函数
  • OpenCV(二十一):图像的放大与缩小
  • 【Datawhale25年11月组队学习:hello-agents+Task1学习笔记】
  • 从零开始:如何搭建你的第一个简单的Flask网站
  • Babylon.js材质冻结的“双刃剑“:性能优化与IBL环境冲突的深度解析
  • 力扣1611——使整数变为 0 的最少操作次数(简单易懂版)
  • uni-app PDA焦点录入实现
  • uniapp接入安卓端极光推送离线打包
  • 宁波模板建站定制网站建立企业网站的流程
  • hotspot vm 参数解析
  • Titiler无需切片即可实现切片形式访问影像
  • 通过数学变换而不是组装来构造软件
  • Week 24: 深度学习补遗:Vision Transformer (ViT) 复现
  • 做的好的茶叶网站wordpress百度百科
  • paho mqtt c 指定tls加密算法安全套件
  • 2025年下半年网络工程师基础知识真题及答案解析
  • 网站怎么做电脑系统下载文件安装wordpress素锦
  • 解析 CodexField 五大核心模块:构建下一代链上内容资产基础设施
  • 如何在命令行启用Dev-C++的调试模式?
  • handler机制原理面试总结
  • 人工智能备考——1.2.1-1.2.5总结
  • SQL50+Hot100系列(11.9)
  • vue-router相关理解