c++多线程详解

avatar shenyifan 2023-10-16 21:50 245次浏览 评论已关闭

c  11多线程:thread mythread(obj):可调用的对象可以是函数,也可以是类别detach():子线程与主线程失去关联  运行库管理,等待线程执行完成,清理线程相关资源,使用join时,不能使用detach

join():子线程与主线程相关joinable:判断是否可以使用join或detach返回true和falseinlcudethread mythread(func_name);//1.创建线程2。

这个线程开始执行if(mythread.joinable()){mythread.join()///阻塞主线程,等待mythread完成}成员函数作为线程参数#include#include

using namespace std;class A {public:mutable int num///类型转换构造函数可以将int转换为类A对象A(int num) :num(num) {cout << “构造函数执行, ” << this << “threadid=” << std::this_thread::get_id() << endl;

}A(const A& a) :num(a.num) {cout << 执行复制构造函数, ” << this << “threadid=” << std::this_thread::get_id() << endl;

}~A() {cout << “执行分析函数, ” << this << “threadid=” << std::this_thread::get_id() << endl;}void thread_work(int num) {

num = 199;////修改不会影响main的值cout << “子线程num=” << num << endl;cout << “子线程thread_work执行, ” << “threadid=” << std::this_thread::get_id() << endl;

}};void test(const A& a) {a.num = 199;////修改不会影响main的值cout << “a.num=” << a.num << endl;cout << “线程test的参数地址为” << &a << “threadid=” << std::this_thread::get_id() << endl;

}int main() {cout << “主线程id是” << std::this_thread::get_id() << endl;A a(10);int num = 100;//第一个参数是对象函数指针,第二个参数对象,其次是函数所需的参数

thread th(&A::thread_work, a,num);th.join();cout << “主线程num=” << num << endl;cout << 主线程的a.num=” << a.num << endl;

cout << “完成主线程执行” << endl;return 0;}转移线程所有权:线程属于resource-owning类型,同时只能有一个对象控制权因此,线程只能移动而不能复制void func1():。

void func2():thread t1(func1)thread t2 = move(t1)线程数量在运行时确定:int threadnum = thread::hardware_concurrecy();

识别线程:this_thread::get_id()//获得当前线程id共享线程间的数据变量互斥:muxtex创建使用lock上锁,unlock解锁需要在每个函数的出口或异常中调用unlocklock_guard

mutex mu版本1写法void shared_print_1(string msg, int id){mu.lock();cout<

void shared_print_2(string msg, int id){lock_guardguard(mu);cout<

条件变量:std::condition_variable和std::condition_variable_any

来源:深易凡软件库

发表评论
请先登录后再评论~