2.0-chinese
发表于|更新于|C++
|总字数:210|阅读时长:1分钟|浏览量:
第2章 线程管理
本章主要内容
- 启动新线程
- 等待线程与分离线程
- 线程唯一标识符
好的!看来你已经决定使用多线程了。先做点什么呢?启动线程、结束线程,还是如何监管线程?C++标准库中只需要管理std::thread关联的线程,无需把注意力放在其他方面。不过,标准库太灵活,所以管理起来不会太容易。
本章将从基本开始:启动一个线程,等待这个线程结束,或放在后台运行。再看看怎么给已经启动的线程函数传递参数,以及怎么将一个线程的所有权从当前std::thread对象移交给另一个。最后,再来确定线程数,以及识别特殊线程。
文章作者: Estom
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Estom的博客!
相关推荐

2022-12-05
27.单例的实现方式有几种?它们有什么优缺点?
单例的实现方式有几种?它们有什么优缺点?单例模式是 Java 中最简单的设计模式之一,它是指一个类在运行期间始终只有一个实例,我们就把它称之为单例模式。它不但被应用在实际的工作中,而且还是面试中最常考的题目之一。通过单例模式我们可以知道此人的编程风格,以及对于基础知识的掌握是否牢固。 我们本课时的面试题是,单例的实现方式有几种?它们有什么优缺点? 典型回答单例的实现分为饿汉模式和懒汉模式。 饿汉模式顾名思义,饿汉模式就好比他是一个饿汉,而且有一定的危机意识,他会提前把食物囤积好,以备饿了之后直接能吃到食物。对应到程序中指的是,在类加载时就会进行单例的初始化,以后访问时直接使用单例对象即可。 饿汉模式的实现代码如下: 12345678910111213141516171819202122public class Singleton { // 声明私有对象 private static Singleton instance = new Singleton(); // 获取实例(单例对象) public static Singleton get...

2021-09-07
2.2-chinese
2.2 向线程函数传递参数清单2.4中,向std::thread构造函数中的可调用对象,或函数传递一个参数很简单。需要注意的是,默认参数要拷贝到线程独立内存中,即使参数是引用的形式,也可以在新线程中进行访问。再来看一个例子: 12void f(int i, std::string const& s);std::thread t(f, 3, "hello"); 代码创建了一个调用f(3, “hello”)的线程。注意,函数f需要一个std::string对象作为第二个参数,但这里使用的是字符串的字面值,也就是char const *类型。之后,在线程的上下文中完成字面值向std::string对象的转化。需要特别要注意,当指向动态变量的指针作为参数传递给线程的情况,代码如下: 12345678void f(int i,std::string const& s);void oops(int some_param){ char buffer[1024]; // 1 sprintf(buffer, "%i",some...

2022-12-19
02 Java互斥同步
1 互斥访问Java 提供了两种锁机制来控制多个线程对共享资源的互斥访问,第一个是 JVM 实现的 synchronized,而另一个是 JDK 实现的 ReentrantLock。 synchronized1. 同步一个代码块 12345public void func() { synchronized (this) { // ... }} 它只作用于同一个对象,如果调用两个对象上的同步代码块,就不会进行同步。 对于以下代码,使用 ExecutorService 执行了两个线程,由于调用的是同一个对象的同步代码块,因此这两个线程会进行同步,当一个线程进入同步语句块时,另一个线程就必须等待。 12345678910public class SynchronizedExample { public void func1() { synchronized (this) { for (int i = 0; i < 10; i++) ...

2022-12-05
05.synchronized和ReentrantLock
synchronized 和 ReentrantLock 的实现原理是什么?它们有什么区别?在 JDK 1.5 之前共享对象的协调机制只有 synchronized 和 volatile,在 JDK 1.5 中增加了新的机制 ReentrantLock,该机制的诞生并不是为了替代 synchronized,而是在 synchronized 不适用的情况下,提供一种可以选择的高级功能。 典型回答synchronized 属于独占式悲观锁,是通过 JVM 隐式实现的,synchronized 只允许同一时刻只有一个线程操作资源。 在 Java 中每个对象都隐式包含一个 monitor(监视器)对象,加锁的过程其实就是竞争 monitor 的过程,当线程进入字节码 monitorenter 指令之后,线程将持有 monitor 对象,执行 monitorexit 时释放 monitor 对象,当其他线程没有拿到 monitor 对象时,则需要阻塞等待获取该对象。 ReentrantLock 是 Lock 的默认实现方式之一,它是基于 AQS(Abstract Queued Sync...

2022-11-27
总结文档
总结文档 总结文档 普通集合 并发集合 字节流与字符流 static、final、super、this 关键字(this、super 不能用在 static 方法中)以及泛型 异常体系 ava 的 IO java 对象如何判断是否可以回收(注意,此处仅仅为判断对象是否可达,不一定判断对象是否可以回收) java 中的 SPI Java 虚拟机 Java 锁机制 java 多线程 Spring Mybatis Apache HttpClient 普通集合 Arrays.asList()返回的是视图(ArrayList 内部类对象,只提供了替换数据的方法,其底层依旧是原数组数据) subList:返回的 List 是 ArrayList 中某段数据的一个视图,不可在使用时对原对 象进行操作,否则会出现 CME 异常 HashMap 对于容量的初始化分配,在首次 put 操作时执行(lazy load)ii. 并发下出现的死链问题:https://www.jianshu.com/p/619a8efcf589、https://juejin.im/post/5a255bbd6fb...

2021-09-07
2.5-chinese
2.5 标识线程线程标识类型是std::thread::id,可以通过两种方式进行检索。第一种,可以通过调用std::thread对象的成员函数get_id()来直接获取。如果std::thread对象没有与任何执行线程相关联,get_id()将返回std::thread::type默认构造值,这个值表示“无线程”。第二种,当前线程中调用std::this_thread::get_id()(这个函数定义在<thread>头文件中)也可以获得线程标识。 std::thread::id对象可以自由的拷贝和对比,因为标识符就可以复用。如果两个对象的std::thread::id相等,那它们就是同一个线程,或者都“无线程”。如果不等,那么就代表了两个不同线程,或者一个有线程,另一没有线程。 线程库不会限制你去检查线程标识是否一样,std::thread::id类型对象提供相当丰富的对比操作;比如,提供为不同的值进行排序。这意味着允许程序员将其当做为容器的键值,做排序,或做其他方式的比较。按默认顺序比较不同值的std::thread::id,所以这个行为可预见的:当a<b...
公告
欢迎参观Estom的小屋



