c++ 多线程 类成员函数_C++11并发编程:多线程std::thread

本文介绍了C++11中的std::thread类,包括其构造函数、成员函数以及如何创建和管理线程。讨论了线程的join和detach操作,并提到了类成员函数作为线程执行体的使用。同时,文章提醒在传递参数给线程函数时需要注意变量的作用域问题。

一:概述

C++11引入了thread类,大大降低了多线程使用的复杂度,原先使用多线程只能用系统的API,无法解决跨平台问题,一套代码平台移植,对应多线程代码也必须要修改。现在在C++11中只需使用语言层面的thread可以解决这个问题。

所需头文件< thread >

二:构造函数

1.默认构造函数
thread() noexcept
一个空的std::thread执行对象

2.初始化构造函数
template
explicit thread(Fn&& fn, Args&&… args);
创建std::thread执行对象,线程调用threadFun函数,函数参数为args。

void threadFun(int a){
    cout <"this is thread fun !" <endl;
}

thread t1(threadFun, 2);

3.拷贝构造函数
thread(const thread&) = delete;
拷贝构造函数被禁用,std::thread对象不可拷贝构造

void threadFun(int& a){
    cout <"this is thread fun !" <}

int value = 2;
thread t1(threadFun, std::ref(value));

4.Move构造函数
thread(thread&& x)noexcept
调用成功原来x不再是std::thread对象

void threadFun(int& a){
    cout <"this is thread fun !" <}

int value = 2;
thread t1(threadFun, std::ref(value));
thread t2(std::move(t1));
t2.join();

三:成员函数

1.get_id()
获取线程ID,返回类型std::thread::id对象。

thread t1(threadFun);
thread::id threadId = t1.get_id();
cout <"线程ID:" <endl;

//threadId转换成整形值,所需头文件
ostringstream   oss;
oss <string strId = oss.str();
unsigned long long tid = stoull(strId);
cout <"线程ID:" <endl;

2.join()
创建线程执行线程函数,调用该函数会阻塞当前线程,直到线程执行完join才返回。

thread t1(threadFun);
t1.join()  //阻塞等待

3.detach()
detach调用之后,目标线程就成为了守护线程,驻留后台运行,与之关联的std::thread对象失去对目标线程的关联,无法再通过std::thread对象取得该线程的控制权。

4.swap()
交换两个线程对象

thread t1(threadFun1);
thread t2(threadFun2);
cout <"线程1的ID:" <endl;
cout <"线程2的ID:" <endl;

t1.swap(t2);

cout <"线程1的ID:" <endl;
cout <"线程2的ID:" <endl;

5.hardware_concurrency()
获得逻辑处理器储量,返回值为int型

int coreNum = thread::hardware_concurrency();

四:使用

1.创建线程

void threadFun1(){
    cout <"this is thread fun1 !" <endl;
}

int main(){
    thread t1(threadFun1);
    t1.join();

    getchar();
    return 1;
}

2.创建线程,传参

void threadFun1(int v){
    cout <"this is thread fun1 !" <endl;
    cout <endl;
}

int main(){
    int value = 6;
    thread t1(threadFun1, value);
    t1.join();

    getchar();
    return 1;
}

需要注意,变量int value 和int v 做变量传递时并不是引用,而是对变量做了拷贝,所以在传递给int v前,int value不能出作用域(释放了内存),join(),可以保证int value变量释放内存,如果使用detach(),可能存在这种情况。

3.创建线程,引用传参

void threadFun1(int& v){
    cout <"this is thread fun1 !" <    cout <}

int main(){
    int value = 6;
    thread t1(threadFun1, std::ref(value));
    t1.join();

    getchar();
    return 1;
}

4.创建建线程,线程函数为类成员函数

class Object
{
public:
    Object()
    {
        cout <"构造函数" <endl;
    }

    ~Object()
    {
        cout <"析构函数" <endl;
    }

    void fun(string info){
        cout <endl;
    }

};

int main(){

    Object obj;
    string str = "我是一个类的成员函数!";
    thread t1(&Object::fun, &obj, str);
    t1.join();

    getchar();
    return 1;
}

1170aeb4f50c50f63a0cac96d658f1de.png

往期推荐

 

【1】Java线程池详解

【2】nohup启动后台进程并重定向

【3】基于libcurl实现REST风格http/https的get和post

【4】程序员因年纪大惨遭公司开除

【5】程序员躲山洞开发程序,两年敲45万行代码

扫码关注码农code之路,让技术之路更加有趣!

371804144a78148d90ddb036e02d04e3.png

欢迎点好看分享到朋友圈

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值