【C++11】多线程-----创建与使用线程

简介: 【C++11】多线程-----创建与使用线程

前言

本节课我们奖的是C++ 11多线程的创建与使用线程

我们多线程的意义在哪:充分利用CPU资源、简化编程模式、简化异步事件处理、使GUI更有效率…


提示:以下是本篇文章正文内容,下面案例可供参考

创建多线程及lambad表示式的讲解

1.头文件:

多线程的头文件为:#include <thread> using namespace std;


2.怎么创建线程?

首先我们要知道,线程就是一可调用的函数,在C++中,可以使用函数做为入口,也可以用类,类成员函数。main函数也是一个线程,但他是主线程,主线程的结束是在main函数return时,我们自己创建的子线程也是一样:

1).用函数做为入口函数:

void myprint()
{
  cout << "my name is \"my print\"" << endl;
}
int main()
{
  thread t(myprint);//创建一个入口函数为myprint子线程
  return 0;
}

2.用一个类作入口函数

class A
{
public:
  void operator() ()
  {
    cout << "my name is \" A operator\"" << endl;
  }
};
int main()
{
  A a;
  thread t(a);//以一个类对象为入口函数,需要重载"()"并且没有参数
  return 0;
}

3).用类中的函数成员作为入口函数

class A
{
public:
  void fun()
  {
    cout << "fun" << endl;
  }
};
int main()
{
  A a;
  thread t(&A::fun,&a);//我们构造函数的参数1需要函数的地址,参数2为哪个对象的地址
  system("pause>0");
  return 0;
}

使用

说了这么多,没有给我们看到效果啊,别急下面就是使用(有坑):

1).join函数

作用:主线程等待子线程执行完后再执行主线程,阻塞的。

class A
{
public:
  void fun()
  {
    cout << "fun" << endl;
  }
};
int main()
{
  A a;
  thread t(&A::fun,&a);
  t.join();//启动子线程
  return 0;
}

2).detach函数

作用:主线程和子线程一起执行,当主线程没了,子线程就会交给系统管理了,就失去了我们的控制

class A
{
public:
  void fun()
  {
    cout << "fun" << endl;
  }
};
int main()
{
  A a;
  thread t(&A::fun,&a);
  t.detach();
  return 0;
}

3).joinable函数

作用:判断是否可以join/detach true为可以,false为不可以

class A
{
public:
  void fun()
  {
    cout << "fun" << endl;
  }
};
int main()
{
  A a;
  thread t(&A::fun,&a);
  if(t.joinable())
  {
    cout<<"t 未join/detach"<<endl;
  }
  return 0;
}


detach大坑以及一些其他函数

1.传递字符串指针时,我们可以使用容器:const string,原因:

因为我们不知道主线程执行完后,子线程是否在执行,如果主线程没了,内存被回收了,完了:指针指向的东西变不可控了,所以传他

2.参数也不能有引用(detach情况下):和(1)原因基本一样:

如果真的想传引用,使用函数:std::ref();

3.传递类时,尽量构造临时对象进行传递

其他函数:std::this_thread();

查看此线程的id

智能指针的传递

创建:unique_ptr<类型>(指向的变量)

创建他时需要使用std::move()移动语义函数

入口参数也需要遵守上面讲参数的一些规则


目录
打赏
0
0
0
0
61
分享
相关文章
|
2月前
|
python3多线程中使用线程睡眠
本文详细介绍了Python3多线程编程中使用线程睡眠的基本方法和应用场景。通过 `time.sleep()`函数,可以使线程暂停执行一段指定的时间,从而控制线程的执行节奏。通过实际示例演示了如何在多线程中使用线程睡眠来实现计数器和下载器功能。希望本文能帮助您更好地理解和应用Python多线程编程,提高程序的并发能力和执行效率。
69 20
Unity多线程使用(线程池)
在C#中使用线程池需引用`System.Threading`。创建单个线程时,务必在Unity程序停止前关闭线程(如使用`Thread.Abort()`),否则可能导致崩溃。示例代码展示了如何创建和管理线程,确保在线程中执行任务并在主线程中处理结果。完整代码包括线程池队列、主线程检查及线程安全的操作队列管理,确保多线程操作的稳定性和安全性。
|
4月前
|
单线程传奇Redis,为何引入多线程?
Redis 4.0 引入多线程支持,主要用于后台对象删除、处理阻塞命令和网络 I/O 等操作,以提高并发性和性能。尽管如此,Redis 仍保留单线程执行模型处理客户端请求,确保高效性和简单性。多线程仅用于优化后台任务,如异步删除过期对象和分担读写操作,从而提升整体性能。
96 1
|
5月前
|
C++无锁队列:解锁多线程编程新境界
【10月更文挑战第27天】
283 7
C++多线程应用
【10月更文挑战第29天】C++ 中的多线程应用广泛,常见场景包括并行计算、网络编程中的并发服务器和图形用户界面(GUI)应用。通过多线程可以显著提升计算速度和响应能力。示例代码展示了如何使用 `pthread` 库创建和管理线程。注意事项包括数据同步与互斥、线程间通信和线程安全的类设计,以确保程序的正确性和稳定性。
107 5
爬取小说资源的Python实践:从单线程到多线程的效率飞跃
本文介绍了一种使用Python从笔趣阁网站爬取小说内容的方法,并通过引入多线程技术大幅提高了下载效率。文章首先概述了环境准备,包括所需安装的库,然后详细描述了爬虫程序的设计与实现过程,包括发送HTTP请求、解析HTML文档、提取章节链接及多线程下载等步骤。最后,强调了性能优化的重要性,并提醒读者遵守相关法律法规。
151 0
|
2月前
|
Linux编程: 在业务线程中注册和处理Linux信号
本文详细介绍了如何在Linux中通过在业务线程中注册和处理信号。我们讨论了信号的基本概念,并通过完整的代码示例展示了在业务线程中注册和处理信号的方法。通过正确地使用信号处理机制,可以提高程序的健壮性和响应能力。希望本文能帮助您更好地理解和应用Linux信号处理,提高开发效率和代码质量。
58 17
|
2月前
|
Linux编程: 在业务线程中注册和处理Linux信号
通过本文,您可以了解如何在业务线程中注册和处理Linux信号。正确处理信号可以提高程序的健壮性和稳定性。希望这些内容能帮助您更好地理解和应用Linux信号处理机制。
63 26
|
4月前
|
Java多线程编程秘籍:各种方案一网打尽,不要错过!
Java 中实现多线程的方式主要有四种:继承 Thread 类、实现 Runnable 接口、实现 Callable 接口和使用线程池。每种方式各有优缺点,适用于不同的场景。继承 Thread 类最简单,实现 Runnable 接口更灵活,Callable 接口支持返回结果,线程池则便于管理和复用线程。实际应用中可根据需求选择合适的方式。此外,还介绍了多线程相关的常见面试问题及答案,涵盖线程概念、线程安全、线程池等知识点。
331 2

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等