C++11 并发与多线程篇(未完成)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_26822029/article/details/83038624

从C++11新标准开始,C++语言本身增加了对多线程的支持,意味着使用C++可实现多线程程序的可移植,跨平台。

在标准的C++程序中,主线程从main()开始执行,我们自己在C++中创建的线程,也需要从一个函数开始执行(这个函数叫做初始函数),一旦这个函数运行完毕,我们创建的线程也就执行结束了。

一个书写良好的程序,必须等所有的子线程执行完毕之后,主线程才能结束。

一、C++11创建线程基本方法

1.1 使用函数创建线程

1 添加头文件

添加头文件以使用多线程:#include <thread>

1  创建初始函数

定义一个函数,这个函数将会作为我们创建的线程的初始函数:

void thread_function()
{
	cout << "start executing my thread..." << endl;
}

3 在程序中添加线程,以及基本的线程函数

新建一个线程使用:

thread 线程名称(初始函数) 

join()函数

用法:线程名称.join()

说明:使用该函数后,主线程阻塞到这里,当子线程执行完毕,这个join()函数就执行完毕,主线程也就可以继续运行了。

detach()函数

传统多线程程序,主线程要等待子线程执行完毕,然后自己再退出。

deteach的意思是分离,也就是主线程不必和子线程汇合了,主线程与子线程各自执行。引入detach()是为了避免让主线程逐个等待子线程结束。

joinable()函数

判断是否可以成功使用join()或者detach(),返回true则可以,返回false则不可以。

最后的完整程序如下,您可以通过依次运行mythread.join(),mythread.detach()函数查看程序运行结果以加深对这几个函数的理解。

#include <iostream>
#include <thread>
using namespace std;

void thread_function()
{
    for(int i = 0; i < 5; i++)
        cout << "子线程运行" << i+1 << endl;
}

int main()
{
    thread mythread(thread_function);        // 传递初始函数作为线程的参数
    if(mythread.joinable())
        mythread.join();                     // 使用join()函数阻塞主线程直至子线程执行完毕
    if(mythread.joinable())
        mythread.detach();                   // 使用detach()函数让子线程和主线程并行运行,主线程也不再等待子线程。
	
    for(int i = 0; i < 5; i++)
        cout << "主线程运行" << i+1 << endl;

    return 0;
} 

4 运行结果分析

如果只使用join()函数,注释detach()函数,运行结果如下,为顺序执行:

如果只使用detach()函数,运行结果如下,每次执行的结果均不相同:

1.2 使用类对象创建线程

创建thread的时候参数不仅可以是一个函数,也可以是一个类的对象。这个类中需要重载运算符(),如下所示:

#include <iostream>
#include <thread>
using namespace std;

class Thread
{
public:
    // 运算符重载 
    void operator()()
    {
        for(int i = 0; i < 5; i++)
        cout << "子线程运行" << i+1 << endl;
    }	
};

int main()
{
    Thread t;
    thread mythread(t);        // 传递初始函数作为线程的参数
    if(mythread.joinable())
        mythread.join();       // 使用join()函数阻塞主线程直至子线程执行完毕
    if(mythread.joinable())
        mythread.detach();     // 使用detach()函数让子线程和主线程并行运行,主线程也不再等待子线程。
	
    for(int i = 0; i < 5; i++)
        cout << "主线程运行" << i+1 << endl;

    return 0;
} 

1.3 用Lambda表达式创建线程

在C++11中引入了lambda表达式,Lambda表达式完整的声明格式如下:

[capture list] (params list) mutable exception-> return type { function body }

 

关于Lambda表达式的详细用法:https://www.cnblogs.com/DswCnblog/p/5629165.html 

#include <iostream>
#include <thread>
using namespace std;

int main()
{
	auto mylamthread = [] {
		for(int i = 0; i < 5; i++)
			cout << "子线程执行" << endl; 
	};
	
    thread mythread(mylamthread);        // 传递初始函数作为线程的参数
    if(mythread.joinable())
   		mythread.join();                         // 使用join()函数阻塞主线程直至子线程执行完毕
   	if(mythread.joinable())
    	mythread.detach();                       // 使用detach()函数让子线程和主线程并行运行,主线程也不再等待子线程。
	
    for(int i = 0; i < 5; i++)
        cout << "主线程运行" << i+1 << endl;

    return 0;
} 

猜你喜欢

转载自blog.csdn.net/qq_26822029/article/details/83038624
今日推荐