Xander's Wiki


  • Home

  • Tags

  • Categories

  • Archives

  • Search

设计无锁并发数据结构——概述

Posted on 2021-07-31 | In C++并发编程实战

前言

 
互斥锁的理解成本很低,带来的收益却很高——可以保证在多线程情况下安全地访问数据结构,而不会产生竞争条件或破坏不变量。
但互斥锁并非完美无缺,不正确地使用可能带来死锁,粗粒度地上锁将影响并发性。
如果能写出一个不使用锁的并发数据结构,则可避免上述互斥锁引入的问题,这样的数据结构被被称为无锁(lock-free)数据结构。
无锁结构的核心是前文提及的内存顺序属性,设计无锁结构时需要万分小心——它不仅很难正确实现,同时其内部bug很难稳定复现与定位原因。

Read more »

设计基于锁的并发数据结构——更复杂的数据结构

Posted on 2021-07-22 | In C++并发编程实战

前言

 
上一节所提及的栈和队列均是非常简单的数据结构,使用场景有限。本节将针对【查找表】,【链表】两种使用场景较丰富的数据结构,提供设计实例。

Read more »

设计基于锁的并发数据结构——并发数据结构实例

Posted on 2021-07-13 | In C++并发编程实战

前言

 
设计基于锁的数据结构的核心要旨:在持有锁时间最短的前提下,访问数据时锁住正确的互斥锁。若使用不同的互斥锁来保护数据结构中不同的部分,操作不当可能会导致死锁,因此更需小心。

Read more »

设计基于锁的并发数据结构——并发设计纲要

Posted on 2021-07-08 | In C++并发编程实战

前言

 
选择与设计正确的数据结构是解决方案设计的重中之重,并发编程亦不例外。若某种数据结构存在被多线程访问的可能性,除非其具备只读属性,否则必然需要保证数据变化在线程间被正确同步,对于此,一般有两种设计方案:

  1. 使用独立的互斥锁以及外部加锁来保护数据
  2. 设计自身支持并发访问的数据结构

本章将重点论述第二点。

Read more »

C++内存模型与原子类型操作——同步操作与强制顺序

Posted on 2021-06-24 | In C++并发编程实战

前言

 
一段经典的生产-消费场景代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <vector>
#include <atomic>
#include <iostream>
std::vector<int> data;
std::atomic<bool> data_ready(false);
void reader_thread() {
while(!data_ready.load()) {
std::this_thread::sleep(std::milliseconds(1));
}
std::cout<<"The answer="<<data[0]<<"\n";
}
void writer_thread() {
data.push_back(42);
data_ready=true;
}

这里我们利用原子操作,保证了写入操作必然“先发生于”读取操作。不过,原子操作对顺序要求还有其他选项,它们构成了原子操作间的各种关系,下文将一一说明。
Read more »

C++内存模型与原子类型操作——原子操作与原子类型

Posted on 2020-06-02 | In C++并发编程实战

前言

 
原子类型操作(atomic operation)具备不可分割性,其仅存在执行完成与未执行两种状态。

如若某线程正在以原子操作load一个对象的值(对该对象的所有修改都由原子操作完成),那么它仅能读取到该对象在修改前,亦或某一次修改后的值(无法获取中间状态)。非原子类型操作不具备此性质,因此线程很可能读取到某个对象的中间状态,从而造成数据竞争。

Read more »

VimTutor小结

Posted on 2020-05-05 | In 杂项

本文为vimtutor总结,仅摘录部分常用vim语句以供复习。

Read more »

计算机网络与互联网

Posted on 2020-05-04 | In Computer Networking A Top-Down Approach

本篇为《Computer Network-A Top-Down Approach》第一章读书笔记。

Read more »

C++内存模型与原子类型操作——内存模型基础

Posted on 2020-03-14 | In C++并发编程实战

前言

 

C++11标准引入了全新的多线程内存模型,如果没有它准确地定义基本构建块(building blocks)的工作方式,那么前文所提到的一切并发工具都将成为空谈。

C++内存模型基本可以分为2部分:内存结构(structs,与对象在内存中的布局有关)与并发性,一般认为前者比后者重要,尤其是需要深入了解底层原子操作时。

Read more »

同步并发操作——使用同步操作简化代码

Posted on 2020-03-13 | In C++并发编程实战

前言

 
使用本节描述的技巧编码,开发者可以更多地将注意力集中至同步操作本身——使用函数式编程技法实现并发编程。

相较于在多个线程间直接共享数据,每个任务均拥有自己的数据似乎更为优雅,并且可将任务结果广播至其它线程——这需要使用future实现。

Read more »
<i class="fa fa-angle-left"></i>123…27<i class="fa fa-angle-right"></i>

xander.liu

266 posts
11 categories
36 tags
RSS
GitHub E-Mail
© 2024 xander.liu
Powered by Hexo
|
Theme — NexT.Pisces v5.1.4