A.0-chinese
发表于|更新于|C++
|总字数:269|阅读时长:1分钟|浏览量:
附录A 对C++11语言特性的简要介绍
新的C++标准,不仅带来了对并发的支持,也将其他语言的一些特性带入标准库中。在本附录中,会给出对这些新特性进行简要介绍(这些特性用在线程库中)。除了thread_local(详见A.8部分)以外,就没有与并发直接相关的内容了,但对于多线程代码来说,它们都是很重要。我已只列出有必要的部分(例如,右值引用),这样能够使代码更容易理解。由于对新特性不熟,对用到某些特性的代码理解起来会有一些困难;没关系,当对这些特性渐渐熟知后,就能很容易的理解代码。由于C++11的应用越来越广泛,这些特性在代码中的使用也将会变越来越普遍。
话不多说,让我们从线程库中的右值引用开始,来熟悉对象之间所有权(线程,锁等等)的转移。
文章作者: Estom
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Estom的博客!
相关推荐

2021-09-06
附录12 并发编程
并发编程1 并发概述 并发一般应用在高性能服务器上,用来响应多个客户端的并发访问。但是在客户端也会用到并发的方法,如某些耗时长的文件读取(并发读取,不会阻塞用户进程)、点对点通信(并发通信不会阻塞用户界面)、ajax异步通信(并发获取服务器上的数据,不会阻塞界面)等。 问题重述 什么是并发, 并发编程的应用场景。并发编程与网络编程的关系,并发编程与进程同步、进程通信、设备IO的关系,并发与并行的关系,并发与同步异步的关系 并发编程的核心问题(并发机制、并发同步、并发通信) 并发编程的具体实例(在各种系统和场景下的表现) 并发概念并发和独占对应。 在程序设计的角度,希望通过某些机制让计算机可以在一个时间段内,执行多个任务。 一个或多个物理 CPU 在多个程序之间多路复用,提高对计算机资源的利用率。 任务数多余 CPU 的核数,通过操作系统的任务调度算法,实现多个任务一起执行。 有多个线程在执行,计算机只有一个 CPU,不可能真正同时运行多个线程,操作系统只能把 CPU 运行时间划分成若干个时间段,再将时间段分配给各个线程执行,在一个时间段的线程代码运行时,其它线程处于挂起状。...

2021-09-02
sync
概述sync包对并发和同步机制进行了实现,但显然并发编程这样一个话题过于庞大,无法在一篇博客里面详细展开,所以本文的重点放在sync包的使用。 不过这里首先对并发的背景进行简单的介绍,在单线程的程序中,同一个时刻只存在一个线程对数据进行访问,访问永远是线性的,不需要额外的机制保障;但是当同时存在多个线程可能同时访问一个数据时,由于线程调度的特性,会带来难以预料的结果。试想如下代码会输出什么结果,正常情况会是3,但实际上可能的结果是2或者3,这是由于函数或者代码的运行没有原子性,比如在线程1执行Add1操作时被暂停了(已经读取data,还未写回),然后开始运行线程2,并读取数据,然后两个线程依次执行到结束,由于两个线程读取的值都是data=1,执行Add1后都得到2,而非3。 123456789101112131415161718import ( "fmt" "time")func Add1(data *int) { tmp = *data *data = tmp + 1}fu...

2021-09-07
7.4-chinese
7.4 本章总结从第6章中的基于锁的数据结构起,本章简要的描述了一些无锁数据结构的实现(通过实现栈和队列)。在这个过程中,需要小心使用原子操作的内存序,为了保证无数据竞争,以及让每个线程看到一个预制相关的数据结构。也能了解到,在无锁结构中对内存的管理是越来越难。还有,如何通过帮助线程的方式,来避免忙等待循环。 设计无锁数据结构是一项很困难的任务,并且很容易犯错;不过,这样的数据结构在某些重要情况下可对其性能进行扩展。但愿,通过本章的的一些例子,以及一些指导意见,可以帮助你设计出自己的无锁数据结构,或是实现一份研究报告中的数据结构,或用以发现离职同事代码中的bug。 不管在线程间共享怎么样的数据,你需要考虑数据结构如何使用,并且怎么样在线程间同步数据。通过设计并发访问的数据结构,就能对数据结构的功能进行封装,其他部分的代码就着重于对数据的执行,而非数据的同步。你将会在第8章中看到类似的行为:将并发数据结构转为一般的并发代码。并行算法是使用多线程的方式提高性能,因为算法需要工作线程共享它们的数据,所以对并发数据结构的选择就很关键了。

2021-09-07
6.1-chinese
6.1 为并发设计的意义何在?设计并发数据结构,意味着多个线程可以并发的访问这个数据结构,线程可对这个数据结构做相同或不同的操作,并且每一个线程都能在自己的自治域中看到该数据结构。且在多线程环境下,无数据丢失和损毁,所有的数据需要维持原样,且无条件竞争。这样的数据结构,称之为“线程安全”的数据结构。通常情况下,当多个线程对数据结构进行同一并发操作是安全的,但不同操作则需要单线程独立访问数据结构。或相反,当线程执行不同的操作时,对同一数据结构的并发操作是安全的,而多线程执行同样的操作,则会出现问题。 实际的设计意义并不止上面提到的那样:这就意味着,要为线程提供并发访问数据结构的机会。本质上,是使用互斥量提供互斥特性:在互斥量的保护下,同一时间内只有一个线程可以获取互斥锁。互斥量为了保护数据,显式的阻止了线程对数据结构的并发访问。 这被称为串行化(serialzation):线程轮流访问被保护的数据。这其实是对数据进行串行的访问,而非并发。因此,你需要对数据结构的设计进行仔细斟酌,确保其能真正并发访问。虽然,一些数据结构有着比其他数据结构多的并发访问范围,但是在所有情况下的思路都是一...

2021-09-07
SUMMARY
目录 前言 关于封面 关于本书 第1章 你好,C++的并发世界 1.1 何谓并发 1.2 为什么使用并发? 1.3 C++中的并发和多线程 1.4 开始入门 1.5 本章总结 第2章 线程管理 2.1 线程管理的基础 2.2 向线程函数传递参数 2.3 转移线程所有权 2.4 运行时决定线程数量 2.5 标识线程 2.6 本章总结 第3章 线程间共享数据 3.1 共享数据带来的问题 3.2 使用互斥量保护共享数据 3.3 保护共享数据的替代设施 3.4 本章总结 第4章 同步并发操作 4.1 等待一个事件或其他条件 4.2 使用期望等待一次性事件 4.3 限定等待时间 4.4 使用同步操作简化代码 4.5 本章总结 第5章 C++内存模型和原子类型操作 5.1 内存模型基础 5.2 C++中的原子操作和原子类型 5.3 同步操作和强制排序 5.4 本章总结 第6章 基于锁的并发数据结构设计 6.1 为并发设计的意义何在? 6.2 基于锁的并发数据结构 6.3 基于锁设计更加复杂的数据结构 6.4 本章总结 第7章 无锁并发数据结构设计 7.1 定义和意义 ...

2022-11-27
04 Reactor与Netty
Reactor与NettyReactor概念Reactor模型中定义了三种角色: Reactor:负责监听和分配事件,将I/O事件分派给对应的Handler。新的时间包含连接建立就绪、读就绪、写就绪等。 Acceptor:处理客户端新连接,并分派请求到处理器链中。 Handler:将自身与事件绑定,执行费阻塞读/写人物,完成channel的读入,完成处理业务逻辑后,负责将结果写出channel。 单Reactor - 单线程模型NIO下Reactor单线程,所有的接受连接,处理数据的相关操作都在一个线程中完成,性能上有瓶颈。 单Reactor - 多线程模型把比较消耗时的数据的编解码运算操作放入线程池中执行,虽然提升了性能但是还不是最好的方式。 主从Reactor - 多线程主从多线程,对于服务器来说,接收客户端的连接是比较重要的,因此将这部分操作单独用线程去操作。 这种模式的基本工作流程为: Reactor主线程MainReactor对象通过select监听客户端连接事件,收到事件后,通过Acceptor处理客户端连接事件。 当Acceptor处...
公告
欢迎参观Estom的小屋




