C++11/14 线程的创建与分离的实现

所属分类: 软件编程 / C 语言 阅读数: 61
收藏 0 赞 0 分享

线程的创建

让我们看看示例代码(t1.cpp).

#include <iostream>
#include <thread>

void thread_function()
{
  std::cout << "thread function\n";
}

int main()
{
  std::thread t(&thread_function);  // 线程 t 开始运行
  std::cout << "main thread\n";
  t.join();             // 主线程等待子线程结束
  return 0;
}

代码在linux系统下将输出:

$ g++ t1.cpp -o t1 -std=c++11 -pthread
$ ./t2
thread function
main thread

我们要做的第一件事是创建一个线程对象(工作线程),并给它一个函数形式的任务进行工作。

主线程希望等待线程成功完成。

所以,我们使用join(). 如果最初的主线程不等待新线程执行完成,那么它会继续执行main()函数之后的代码,可能在新线程执行完毕前结束程序。

当主线程在等待时,主线程处于空闲状态。

实际上,操作系统可能会把CPU资源从主线程上移走。

请注意,我们在线程的函数和类的声明中有一个新的标准C++库头文件#include <thread>

下图是流程的流程图

然而,在实际执行中,事情并不是那么理想,更可能是不对称的。也许,它看起来更像下面这张图片。

当工作线程开始构造std::thread t的时候,可能会有创建时的开销(通过使用线程池可以减少此开销),图中虚线表示可能的阻塞状态。

线程的分离

我们可以创建一个新线程使其运行为自由的守护进程。

// t2.cpp
int main()
{
  std::thread t(&thread;_function);
  std::cout << "main thread\n";
  // t.join();
  t.detach();
  return 0;
}

分离的子线程现在是自由的,并自行运行。它变成了一个守护进程。

$ g++ t2.cpp -o t2 -std=c++11 -pthread
$ ./t2
main thread

注意,分离线程没有改变打印输出到标准输出stdout,因为主线程已经结束并退出。

这是多线程编程的特点之一:我们不能确定哪个线程首先运行 (不确定性,除非我们使用同步机制。). 在我们的例子中,由于创建一个新线程需要一定的时间,主线程最有可能比子线程率先执行完毕。

还有一点我们需要注意的是,即使在这个简单的代码中,我们也在共享一个公共资源:std::cout。

因此,为了使代码正常工作,主线程应该允许我们的子线程访问资源。

一旦一个线程分离,我们不能强迫它与主线程重新连接。因此,下面的代码行是错误的,程序会崩溃。

int main()
{
  std::thread t(&thread;_function);
  std::cout << "main thread\n";
  // t.join();
  t.detach();
  t.join();  // Error
  return 0;
}

一旦脱离,线程就应该永远是脱离状态.

我们可以使用joinable()把代码做崩溃前的检查。

因为它joinable()返回为false,join()函数不会被调用,程序运行不会崩溃。

int main()
{
  std::thread t(&thread;_function);
  std::cout << "main thread\n";
  // t.join();
  if(t.joinable()) 
    t.join(); 
  return 0;
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

更多精彩内容其他人还在看

C语言数组入门之数组的声明与二维数组的模拟

这篇文章主要介绍了C语言数组入门之数组的声明与二维数组的模拟,数组学习的同时也要相应理解C语言指针的作用,需要的朋友可以参考下
收藏 0 赞 0 分享

C语言中变量与其内存地址对应的入门知识简单讲解

这篇文章主要介绍了C语言中变量与其内存地址对应的入门知识简单讲解,同时这也是掌握指针部分知识的基础,需要的朋友可以参考下
收藏 0 赞 0 分享

讲解C语言编程中指针赋值的入门实例

这篇文章主要介绍了讲解C语言编程中指针赋值的入门实例,通过const int i与int *const pi这样两个例子来分析指针的赋值和地址指向,需要的朋友可以参考下
收藏 0 赞 0 分享

C语言中的结构体的入门学习教程

这篇文章主要介绍了C语言中的结构体的入门学习教程,以struct语句定义的结构体是C语言编程中的重要基础,需要的朋友可以参考下
收藏 0 赞 0 分享

C语言编程入门之程序头文件的简要解析

这篇文章主要介绍了C语言编程入门之程序头文件的简要解析,包括头文件重复包含问题等方面的说明,需要的朋友可以参考下
收藏 0 赞 0 分享

C语言编程中的联合体union入门学习教程

这篇文章主要介绍了C语言编程中的联合体union入门学习教程,也是C语言入门学习中的基础知识,需要的朋友可以参考下
收藏 0 赞 0 分享

C语言中数组作为函数的参数以及返回值的使用简单入门

这篇文章主要介绍了C语言中数组作为函数的参数以及返回值的使用简单入门,这里以一维数组作为基本条件进行例子讲解,需要的朋友可以参考下
收藏 0 赞 0 分享

MySQL的内存表的基础学习教程

这篇文章主要介绍了MySQL的内存表的基础学习教程,包括内存表的创建以及使用限制等等,需要的朋友可以参考下
收藏 0 赞 0 分享

C++中头文件的概念与基本编写方法

这篇文章主要介绍了C++中头文件的概念与基本编写方法,是C++入门学习中的基础知识,需要的朋友可以参考下
收藏 0 赞 0 分享

jQuery移动页面开发中主题按钮的设计示例

这篇文章主要介绍了jQuery移动页面开发中主题按钮的设计示例,jQuery是当今最具人气的JavaScript开发类库,需要的朋友可以参考下
收藏 0 赞 0 分享
查看更多