锁的基本原理(1)

什么是原子性?

在多线程的场景下, 我们会遇到多个线程访问同一个变量的场景。如果多个线程只读一个全局变量, 那没有任何问题, 任何线程都能读到期望的”定值”。但是如果使用多线程进行并发的读写, 就会发生一致性问题。看下面的程序:

cas单点登陆设计与实现

背景及问题引出

一些大企业如阿里巴巴, 对它旗下的各种网站都做了单点登陆的设计。当进入其中一个网站点击登陆时, 浏览器会被重定向到一个登陆的平台进行登陆。在登陆完成后, 我们又能跳回到原来的页面, 并且此时状态更改为“已登陆”。之后访问阿里巴巴的其它相关网站时, 也会保留登陆状态

linux的线程私有数据以及编译器stack_protector选项

fs和gs提供per-task数据

这两个寄存器被用来访问一些线程私有数据, 其中fs被用户态程序使用, gs被内核态使用。应该知道, 在使用pthread时, 可以通过pthread_self()拿到当前线程的线程id, 其实就是从fs里面拿数据。至于为什么能这么做, 可以参考这篇文章, 详细介绍了linux实现per-task数据的原理。作为应用, 我们只需通过glibc间接的访问errbopthread_self()即可。例如看glibc的代码:

C语言实现基于信号的抢占式协程调度(单线程版本)

前言: linux调度以及最小调度单位

我们知道, linux能调度多个不同的进程。假如现在有一台单核心的cpu, 在cpu上的linux系统正在运行多个进程, 虽然某个时刻只能有一个进程正在运行, 但由于linux的调度能力(不同进程进行切换), 我们可以感知到好像有多个进程在同时运行。这种调度机制源自linux系统能在一个进程运行一段时间后执行上下文切换, 让另一个进程得以运行。

[线程杂谈]pthread实现线程动态栈

前言: 栈的基本逻辑

进行函数调用时, 会将当前指令处的地址压入(push)到栈顶, 从函数返回时, 从栈顶弹出(pop)返回地址, 并跳转过去, 这便是栈的一个使用方法。其次, 在c语言中, 声明一个局部变量, 也会将其压入栈顶(但不是一定的, 我们也可以声明一个寄存器变量, 此时它就代表一个寄存器而不占用栈空间)。然而过深的函数调用会使