【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;
}