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

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


相关文章
|
1天前
|
Java
多线程线程同步
多线程的锁有几种方式
|
4天前
|
Java 调度
基于C++11的线程池
基于C++11的线程池
|
9天前
|
调度 Python
|
11天前
|
安全 算法 Java
17 Java多线程(线程创建+线程状态+线程安全+死锁+线程池+Lock接口+线程安全集合)(下)
17 Java多线程(线程创建+线程状态+线程安全+死锁+线程池+Lock接口+线程安全集合)
50 6
|
1天前
|
安全 C# 开发者
【C# 多线程编程陷阱揭秘】:小心!那些让你的程序瞬间崩溃的多线程数据同步异常问题,看完这篇你就能轻松应对!
【8月更文挑战第18天】多线程编程对现代软件开发至关重要,特别是在追求高性能和响应性方面。然而,它也带来了数据同步异常等挑战。本文通过一个简单的计数器示例展示了当多个线程无序地访问共享资源时可能出现的问题,并介绍了如何使用 `lock` 语句来确保线程安全。此外,还提到了其他同步工具如 `Monitor` 和 `Semaphore`,帮助开发者实现更高效的数据同步策略,以达到既保证数据一致性又维持良好性能的目标。
6 0
|
4天前
|
Dart 编译器 API
Dart ffi 使用问题之在C++线程中无法直接调用Dart函数的问题如何解决
Dart ffi 使用问题之在C++线程中无法直接调用Dart函数的问题如何解决
|
4天前
|
Dart API C语言
Dart ffi 使用问题之想在C/C++中创建异步线程来调用Dart方法,如何操作
Dart ffi 使用问题之想在C/C++中创建异步线程来调用Dart方法,如何操作
|
4天前
|
Java UED
基于SpringBoot自定义线程池实现多线程执行方法,以及多线程之间的协调和同步
这篇文章介绍了在SpringBoot项目中如何自定义线程池来实现多线程执行方法,并探讨了多线程之间的协调和同步问题,提供了相关的示例代码。
31 0
|
6天前
|
C++ 容器
C++中自定义结构体或类作为关联容器的键
C++中自定义结构体或类作为关联容器的键
13 0
|
6天前
|
存储 算法 搜索推荐
【C++】类的默认成员函数
【C++】类的默认成员函数