C++11 多线程- Part 1 : 创建线程的三种方式

翻译自:https://thispointer.com//c-11-multithreading-part-1-three-different-ways-to-create-threads/

这篇文章主要讨论在C++11中如何利用std::thread创建线程

C++11线程库介绍

最早的C++标准仅支持单线程编程。新的C++标准(参考C++11 或C++0x)在2011年出版,在C++11 中介绍了一个新的线程库

编译环境需要:  
Linux: gcc 4.8.1 (Complete Concurrency support)
Windows: Visual Studio 2012 and MingW

例如在linux中执行

g++ –std=c++11 sample.cpp -lpthread

C++11线程创建

在每一个C++应用程序中都有一个默认的主线程,例如main()函数。在C++11中我们可以通过std::thread创建的对象去创建一个新的线程。
每一个std::thread对象都可以与一个线程相关联。需要的头文件为:

#include <thread>

std::thread的构造函数中接受什么参数

我们可以给std::thread对象附加一个回调函数,在这个新的线程启动时,回调函数被执行。这些回调函数可以是下面这些类型

1.) 函数指针
2.) 函数对象
3.) Lambda函数

线程对象可以这样创建:

std::thread thObj(<CALLBACK>);

新线程将在创建新对象后立即启动,并将与启动它的线程并行执行传递的回调。
此外,任何线程都可以通过调用某个线程对象的join()函数来等待它的退出。

让我们看一个主线程将创建单独线程的示例。在创建这个新的线程后,主线程将会在控制台打印一些数据,然后等待这个新的线程退出。

让我们使用三种不同的回调机制来实现上述内容:

1. 使用函数指针创建一个线程

#include <iostream>
#include <thread>

void thread_function()
{
    for(int i = 0; i < 10000; i++)
        std::cout<<"thread function Executing"<<std::endl;
}

int main()
{
    std::thread threadObj(thread_function);
    for(int i = 0; i < 10000; i++)
        std::cout<<"Display From MainThread"<<std::endl;
    threadObj.join();
    std::cout<<"Exit of Main function"<<std::endl;
    return 0;
}

2. 使用函数对象创建一个线程

#include <iostream>
#include <thread>
class DisplayThread
{
public:
    void operator()()
    {
        for(int i = 0; i < 10000; i++)
            std::cout<<"Display Thread Executing"<<std::endl;
    }
};

int main()
{
    std::thread threadObj( (DisplayThread()) );
    for(int i = 0; i < 10000; i++)
        std::cout<<"Display From Main Thread "<<std::endl;
    std::cout<<"Waiting For Thread to complete"<<std::endl;
    threadObj.join();
    std::cout<<"Exiting from Main Thread"<<std::endl;
    return 0;
}

3. 使用Lambda函数创建一个线程

#include <iostream>
#include <thread>
int main()
{
    int x = 9;
    std::thread threadObj([]{
            for(int i = 0; i < 10000; i++)
                std::cout<<"Display Thread Executing"<<std::endl;
            });
    for(int i = 0; i < 10000; i++)
        std::cout<<"Display From Main Thread"<<std::endl;
    threadObj.join();
    std::cout<<"Exiting from Main Thread"<<std::endl;
    return 0;
}

如何区分线程

每一个std::thread对象都有一个相关联的ID,我们可以通过下面的成员函数获取使用:

std::thread::get_id()

获取当前线程的ID的方法为:

std::this_thread::get_id()

如果 std::thread 对象没有和任何对象关联,则 get_id() 函数会返回默认构造的 std:🧵:id 对象,即“非线程”

std:🧵:id 是一个对象,它也可以在控制台上进行比较和打印。让我们来看一个例子:

#include <iostream>
#include <thread>
void thread_function()
{
    std::cout<<"Inside Thread :: ID  = "<<std::this_thread::get_id()<<std::endl;
}
int main()
{
    std::thread threadObj1(thread_function);
    std::thread threadObj2(thread_function);

    if(threadObj1.get_id() != threadObj2.get_id())
        std::cout<<"Both Threads have different IDs"<<std::endl;

    std::cout<<"From Main Thread :: ID of Thread 1 = "<<threadObj1.get_id()<<std::endl;
    std::cout<<"From Main Thread :: ID of Thread 2 = "<<threadObj2.get_id()<<std::endl;

    threadObj1.join();
    threadObj2.join();
    return 0;
}
posted on 2020-04-14 14:03  JJ_S  阅读(940)  评论(0编辑  收藏  举报