C++11 之 thread线程类

文章介绍了C++11引入的std::thread类,用于创建和管理线程,支持并发编程。线程可以通过传递函数或成员函数来启动,提供了join()和detach()方法来控制线程执行,以及get_id()获取线程ID。此外,还提到了硬件_concurrency()函数用于获取系统支持的并发线程数量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

在C++11之前,C / C++一直是一种顺序的编程语言。顺序是指所有指令都是串行执行的,即在相同的时刻,有且仅有单个CPU的程序计数器指向可执行代码的代码段,并运行代码段中的指令。而C / C++代码也总是对应地拥有一份操作系统赋予进程的包括堆、栈、可执行的(代码)及不可执行的(数据)在内的各种内存区域。

在C++11 标准中,增加了线程以及线程相关的类,很方便地支持了并发编程,使得编写的多线程程序的可移植性得到了很大的提高。

一、thread是什么?

std::thread 是 C++ 标准库中的一个类,用于创建和管理线程。它提供了一种在 C++ 中实现多线程编程的方式。

通过 std::thread,您可以创建新的线程并在其中执行函数或者可调用对象。线程可以并行地执行代码,使得您可以在同一程序中同时执行多个任务。

二、thread类构造函数

  • 构造函数接受可调用对象作为参数

构造函数接受可调用对象作为参数'func'构造函数接受可调用对象作为参数'args',创建一个新的线程对象,并执行'func'函数,函数参数为'args' 

template< class Function, class... Args >
explicit thread( Function&& func, Args&&... args );

 使用示例:

    void myFunction(int param)
    {
        std::cout << "例子1输出:" << std::endl;
        std::cout << "myFunction:" << param << std::endl;
    }

    std::thread myThread1(myFunction, 42);
    myThread1.join();

    int value = 10;
    std::thread myThread2([value](int param)
    {
        std::cout << "例子2输出:" << std::endl;
        std::cout << "myLambda:" << param;
    }, 24);
    myThread2.join();

输出结果: 

  • 构造函数接受成员函数指针和对象实例作为参数
template< class Class, class... Args >
explicit thread( Class&& obj, Args&&... args );

 使用示例:

    class MyClass
    {
    public:
        void printHelloWorld() const
        {
            std::cout << "子线程输出:" << std::endl;
            std::cout << "类成员函数和对象实例作为线程类thread参数:" << std::endl;
        }
    };

    MyClass obj;
    std::thread myThread(&MyClass::printHelloWorld, &obj);
    myThread.join();

 输出结果:

 

  • 构造函数接受函数对象(仿函数)作为参数
template< class Callable, class... Args >
explicit thread( Callable&& f, Args&&... args );

使用示例:

    struct MyClass
    {
        void operator()()
        {
            std::cout << "子线程输出" << std::endl;
            std::cout << "仿函数作为线程类thread参数" << std::endl;
        }
    };
    
    MyClass myClass;
    std::thread myThread4(myClass);
    myThread4.join();

结果输出:

三、thread类公共成员函数

1、get_id()

 获取线程ID,类型为std::thread::id,用于获取当前线程的ID,每个线程仅有一个唯一的ID。

使用示例:

    std::cout << "主线程ID:" << std::this_thread::get_id()<<std::endl;

    std::thread myThread([]()
    {
            std::cout << "子线程ID:" << std::this_thread::get_id()<<std::endl;
    });
    std::cout << "子线程ID:" << myThread.get_id() << std::endl;
    myThread.join();

结果输出:

2、join()

"join()""std::thread"的一个成员函数,用于等待线程执行完毕。调用"join()"函数将阻塞当前线程,知道被调用的线程执行完毕。

使用示例:

#include <iostream>
#include <thread>

void myFunction() {
    // 线程执行的函数
    for (int i = 0; i < 5; ++i) {
        std::cout << "Thread executing..." << std::endl;
    }
}

int main() {
    std::thread myThread(myFunction);  // 创建线程并执行 myFunction

    // 其他操作...

    myThread.join();  // 等待线程执行完成

    std::cout << "Main thread continues..." << std::endl;

    return 0;
}

结果输出:

 

3、detach()

"detach()"用于将线程与实际的线程分离,分离后线程在后台继续执行,与主线程无关。主线程不再追踪和控制分离的线程。子线程任务执行完毕后,将自动是否自己占用的系统资源

使用示例:

#include <iostream>
#include <thread>

void myFunction() {
    // 线程执行的函数
    for (int i = 0; i < 5; ++i) {
        std::cout << "Thread executing..." << std::endl;
    }
}

int main() {
    std::thread myThread(myFunction);  // 创建线程并执行 myFunction

    // 其他操作...

    myThread.detach();  // 分离线程,使其在后台继续执行

    std::cout << "Main thread continues..." << std::endl;

    // 等待子线程执行完毕
    std::this_thread::sleep_for(std::chrono::seconds(5));

    return 0;
}

结果输出:

 

4、joinable()

"joinable()""std::thread"类的一个成员函数,用于检查线程是否可以被"join()""detach()"。如果线程对象尚未与实际的线程关联,或者已经被"join()"或 "detach()",则该函数返回"false“,否则返回”true“

使用示例:

#include <iostream>
#include <thread>

void myFunction() {
    // 线程执行的函数
    for (int i = 0; i < 5; ++i) {
        std::cout << "Thread executing..." << std::endl;
    }
}

int main() {
    std::thread myThread(myFunction);  // 创建线程并执行 myFunction

    // 其他操作...

    if(myThread.joinable())
    {
        std::cout << "joinable:" << (myThread.joinable() ? "true" : "false") <<std::endl;

        myThread.join();

        std::cout << "joinable:" << (myThread.joinable() ? "true" : "false") <<std::endl;
    }

    std::cout << "Main thread continues..." << std::endl;

    return 0;
}

结果输出:

 

5、swap

”swap“用于交换两个线程对象的状态。它将两个线程对象之间的执行内容进行交换,使得一个线程对象接管另一个线程对象的执行。

使用示例:

#include <iostream>
#include <thread>

void myFunction1() {
    std::cout << "Thread 1 executing..." << std::endl;
}

void myFunction2() {
    std::cout << "Thread 2 executing..." << std::endl;
}

int main() {
    std::thread thread1(myFunction1);  // 创建线程1,并执行 myFunction1
    std::thread thread2(myFunction2);  // 创建线程2,并执行 myFunction2

    // 其他操作...

    thread1.swap(thread2);  // 交换两个线程对象的执行内容

    // 其他操作...

    thread1.join();  // 等待线程1执行完成
    thread2.join();  // 等待线程2执行完成

    std::cout << "Main thread continues..." << std::endl;

    return 0;
}

结果输出:

 

四、thread类静态函数

1、hardware_concurrency()

"hardware_concurrency()"用于获取系统支持的并发线程数。它返回一个表示支持的并发线程数的无符号整数值。

使用示例:

#include <iostream>
#include <thread>

int main() {
    unsigned int numThreads = std::thread::hardware_concurrency();
    std::cout << "Number of concurrent threads supported: " << numThreads << std::endl;

    return 0;
}

结果输出:


 

总结

以上就是对C++11Thread的简单介绍,后续将为大家介绍C++的线程通信。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是一只程序猿啊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值