C++(2): std::thread的使用

1. 线程

线程是操作系统能够进行运算调度的最小单位。为了提高任务执行效率,在一些并发编程中,我们经常会使用多线程技术来同步执行一些任务。

线程的主要优势在于它们允许程序进行并发处理。在多核或多处理器的系统中,多线程可以提升应用程序的性能,因为不同的线程可以并行执行。即便在单核处理器上,通过线程的时间分片(时间片轮转),操作系统也能提供多任务并发执行的感觉,这样可以使应用程序更加响应,提高资源的利用率。

C++中为我们提供了语言级的线程库std::thread,实现了对线程的高级管理功能。

std::thread 属于 <thread> 头文件中的一部分,它允许你在程序中创建和控制线程。使用 std::thread 可以把函数或者函数对象作为线程的执行体,线程开始执行时,这个函数或函数对象就会被调用。

接下来,我们利用最简单的描述,介绍利用std::thread启动线程及传参。

2. 线程启动

(1)使用函数指针启动线程

//函数指针可以是可调用对象,传递给 std::thread 构造函数以初始化线程。
void foo(param)
{ 
   ... 
}
// The parameters to the function are put after the comma
std::thread thread_obj(foo, params);

 

(2)使用 Lambda 表达式启动线程

//定义一个lambda表达式
auto f = [](params)
{
 ...
};
//使用 lambda 表达式作为可调用对象来启动
std::thread thread_object(f, params);

(3)使用函数对象启动线程

// 定义一个函数对象
class fn_object_class {
 // 重载operator()
 void operator()(params)
 { 
    ...
 }
}
std::thread thread_object(fn_object_class(), params);

(4)使用非静态成员函数启动线程

// 定义一个类
class Base {
public:
 // 非静态成员函数
 void foo(param) { ... }
}
//创建Base类对象b
Base b;
// 第一个参数是类非静态成员函数的引用
// 第二个参数类对象的引用
// 第三个参数是非静态成员函数的参数
std::thread thread_obj(&Base::foo, &b, params);

(5)使用静态成员函数启动线程

// 定义一个类
class Base {
public:
 //静态成员数
 static void foo(param) { ... }
}
//创建Base类对象b
Base b;
// 其一个参数是类静态成员函数的引用
// 第二个参数是该函数的参数
std::thread thread_obj(&Base::foo, params);

(6)在类内部创建线程

#include <iostream>
#include <sstream>
#include <fstream>
#include <iomanip>
#include <thread>
class demo
{
public:
    demo(int a){
        reserved = a;
    }
    ~demo(){
    }
    void eval_display()
    {
        while(1){
            static int count = 0;
            printf("reserved: %d\n", reserved);
            sleep(1);
            count++;
            if(count == 50){
                break;
            }
        }
    }
    int launch(){
        t = std::thread(&demo::eval_display, this);
        pthread_setname_np(t.native_handle(), "demo");
        return 0;
    }
    int join(){
        if(t.joinable()){
            t.join();
        }
        return 0;
    }
private:
    int reserved;
    std::thread t;
};
int main(int argc, char* argv[])
{
    demo* d = new demo(12);
    d->launch();
    d->join();
    printf("task complete!\n");
    return 0;
}

3. 函数传参

(1)传递简单数据

int a = 10;
void thread_func(int params){}
std::thread t0(thread_func, a);

(2)传递简单数据引用(慎用detach)

int a = 10;
void thread_func(int& params){}
std::thread t0(thread_func, std::ref(a));

(3)传递指针(慎用detach)

int a = 10;
int* a_addr = &a;
void thread_func(int* params){}
std::thread t0(thread_func, a_addr);

(4)传递类对象

参考“传递简单数据”

(5)传递类对象引用(慎用detach)

参考“传递简单数据引用”

(6)传递临时对象

void thread_func(int params){}
std::thread t0(thread_func, 20);

std::threadC++标准库中的一个类,用于创建和管理线程。通过std::thread,我们可以在不同的线程中执行并发的任务。std::thread可以接受一个可调用对象(函数、函数指针、lambda表达式等)作为参数,并在新的线程中执行该对象。引用提到了一个std::packaged_task的用法,它可以用来将一个可调用对象封装成一个可以异步执行的任务,并返回一个std::future对象,可以在需要的时候获取任务的结果。而引用展示了如何传递参数给线程函数,可以使用std::ref来传递引用类型的参数。最后,引用介绍了在函数外部创建和管理线程的方式,可以将std::thread对象的所有权转移给其他函数或对象。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [C++std::thread](https://blog.csdn.net/OneOnce/article/details/125626769)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [C/C++编程:std::thread 详解](https://blog.csdn.net/zhizhengguan/article/details/107352959)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值