【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()移动语义函数

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


相关文章
|
20天前
|
缓存 安全 C++
C++无锁队列:解锁多线程编程新境界
【10月更文挑战第27天】
34 7
|
20天前
|
消息中间件 存储 安全
|
26天前
|
存储 并行计算 安全
C++多线程应用
【10月更文挑战第29天】C++ 中的多线程应用广泛,常见场景包括并行计算、网络编程中的并发服务器和图形用户界面(GUI)应用。通过多线程可以显著提升计算速度和响应能力。示例代码展示了如何使用 `pthread` 库创建和管理线程。注意事项包括数据同步与互斥、线程间通信和线程安全的类设计,以确保程序的正确性和稳定性。
|
27天前
|
Java 开发者
在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口
【10月更文挑战第20天】在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口。本文揭示了这两种方式的微妙差异和潜在陷阱,帮助你更好地理解和选择适合项目需求的线程创建方式。
19 3
|
27天前
|
Java 开发者
在Java多线程编程中,选择合适的线程创建方法至关重要
【10月更文挑战第20天】在Java多线程编程中,选择合适的线程创建方法至关重要。本文通过案例分析,探讨了继承Thread类和实现Runnable接口两种方法的优缺点及适用场景,帮助开发者做出明智的选择。
17 2
|
27天前
|
Java
Java中多线程编程的基本概念和创建线程的两种主要方式:继承Thread类和实现Runnable接口
【10月更文挑战第20天】《JAVA多线程深度解析:线程的创建之路》介绍了Java中多线程编程的基本概念和创建线程的两种主要方式:继承Thread类和实现Runnable接口。文章详细讲解了每种方式的实现方法、优缺点及适用场景,帮助读者更好地理解和掌握多线程编程技术,为复杂任务的高效处理奠定基础。
29 2
|
27天前
|
Java 开发者
Java多线程初学者指南:介绍通过继承Thread类与实现Runnable接口两种方式创建线程的方法及其优缺点
【10月更文挑战第20天】Java多线程初学者指南:介绍通过继承Thread类与实现Runnable接口两种方式创建线程的方法及其优缺点,重点解析为何实现Runnable接口更具灵活性、资源共享及易于管理的优势。
33 1
|
27天前
|
安全 Java 开发者
Java多线程中的`wait()`、`notify()`和`notifyAll()`方法,探讨了它们在实现线程间通信和同步中的关键作用
本文深入解析了Java多线程中的`wait()`、`notify()`和`notifyAll()`方法,探讨了它们在实现线程间通信和同步中的关键作用。通过示例代码展示了如何正确使用这些方法,并分享了最佳实践,帮助开发者避免常见陷阱,提高多线程程序的稳定性和效率。
34 1
|
1月前
|
存储 消息中间件 资源调度
C++ 多线程之初识多线程
这篇文章介绍了C++多线程的基本概念,包括进程和线程的定义、并发的实现方式,以及如何在C++中创建和管理线程,包括使用`std::thread`库、线程的join和detach方法,并通过示例代码展示了如何创建和使用多线程。
44 1
C++ 多线程之初识多线程
|
27天前
|
Java
在Java多线程编程中,`wait()` 和 `notify()/notifyAll()` 方法是线程间通信的核心机制。
在Java多线程编程中,`wait()` 和 `notify()/notifyAll()` 方法是线程间通信的核心机制。它们通过基于锁的方式,使线程在条件不满足时进入休眠状态,并在条件成立时被唤醒,从而有效解决数据一致性和同步问题。本文通过对比其他通信机制,展示了 `wait()` 和 `notify()` 的优势,并通过生产者-消费者模型的示例代码,详细说明了其使用方法和重要性。
25 1