#include <stdio.h>
#include <stdint.h>
#include <unistd.h>
/*
typedef unsigned long ngx_atomic_uint_t;
typedef volatile ngx_atomic_uint_t ngx_atomic_t;
typedef long ngx_atomic_int_t; #define ngx_atomic_cmp_set(lock, old, set) __sync_bool_compare_and_swap(lock, old, set)
*/ #define my_unlock(lock) *(lock) = 0 //lock: 原子变量表达的锁
//value:标志位,锁是否被某一进程占用,一般情况下为进程pid
//spin: 在多处理器系统内,当my_spinlock方法没有拿到锁时,当前进程在内核的一次调度中该方法等待其他处理器释放锁的时间
void my_spinlock(volatile unsigned long *lock,long value,uintptr_t spin)
{
uintptr_t i,n;
while(1){
//lock为0表示没有其他进程持有锁,这时将lock值设置为value,表示当前进程持有了锁
if(*lock == 0 && __sync_bool_compare_and_swap(lock, 0, value)){
return;
}
//如果是多处理器系统
if(sysconf(_SC_NPROCESSORS_CONF) > 1){
for (n = 1; n < spin; n <<= 1) {
//随着等待的次数越来越多,实际去检查锁的间隔时间越来越大
for (i = 0; i < n; i++) {
__asm__ ("pause");
}
//检查锁是否被释放
if (*lock == 0 && __sync_bool_compare_and_swap(lock, 0, value)) {
return;
}
}
}
//当前进程让出处理器,但仍然处于可执行状态
sched_yield();
}
} /* void ngx_spinlock(ngx_atomic_t *lock, ngx_atomic_int_t value, ngx_uint_t spin)
{ #if (NGX_HAVE_ATOMIC_OPS)//支持原子操作 ngx_uint_t i, n; //一直处于循环中,直到获取到锁
for ( ;; ) { //lock为0表示没有其他进程持有锁,这时将lock值设置为value参数表示当前进程持有了锁
if (*lock == 0 && ngx_atomic_cmp_set(lock, 0, value)) {
return;
} //如果是多处理器系统
if (ngx_ncpu > 1) {
for (n = 1; n < spin; n <<= 1) {
//随着等待的次数越来越多,实际去检查锁的间隔时间越来越大
for (i = 0; i < n; i++) {
ngx_cpu_pause();//告诉CPU现在处于自旋锁等待状态
} //检查锁是否被释放
if (*lock == 0 && ngx_atomic_cmp_set(lock, 0, value)) {
return;
}
}
} //当前进程让出处理器,但仍然处于可执行状态
ngx_sched_yield();
} #else #if (NGX_THREADS) #error ngx_spinlock() or ngx_atomic_cmp_set() are not defined ! #endif #endif } */ volatile unsigned long lock; int main()
{
fprintf(stderr,"cpu %d pid=%d\n",sysconf(_SC_NPROCESSORS_CONF),getpid());
my_spinlock(&lock,getpid(),1024);
fprintf(stderr,"lock %d\n",lock);
my_unlock(&lock);
fprintf(stderr,"lock %d\n",lock);
return 0; }

nginx自旋锁的更多相关文章

  1. Nginx学习之四-Nginx进程同步方式-自旋锁(spinlock)

    自旋锁简介 Nginx框架使用了三种消息传递方式:共享内存.套接字.信号. Nginx主要使用了三种同步方式:原子操作.信号量.文件锁. 基于原子操作,nginx实现了一个自旋锁.自旋锁是一种非睡眠锁 ...

  2. 菜鸟nginx源代码剖析数据结构篇(十) 自旋锁ngx_spinlock

    菜鸟nginx源代码剖析数据结构篇(十) 自旋锁ngx_spinlock Author:Echo Chen(陈斌) Email:chenb19870707@gmail.com Blog:Blog.cs ...

  3. 菜鸟nginx源码剖析数据结构篇(十) 自旋锁ngx_spinlock[转]

    菜鸟nginx源码剖析数据结构篇(十) 自旋锁ngx_spinlock Author:Echo Chen(陈斌) Email:chenb19870707@gmail.com Blog:Blog.csd ...

  4. 可重入锁 & 自旋锁 & Java里的AtomicReference和CAS操作 & Linux mutex不可重入

    之前还是写过蛮多的关于锁的文章的: http://www.cnblogs.com/charlesblc/p/5994162.html <[转载]Java中的锁机制 synchronized &a ...

  5. nginx的锁

    一.原理 nginx的锁是基于共享内存实现的,这点跟redis中利用一个存储(也就是一个键值对)来实现锁的原理是一致的,每一项操作通过检查锁对象的lock域是否为0,来判断能否获取锁并尝试获取锁. 二 ...

  6. 从自旋锁、睡眠锁、读写锁到 Linux RCU 机制讲解

    ​    同步自我的 csdn 博客 6.S081 从自旋锁.睡眠锁.读写锁到 Linux RCU 机制讲解_我说我谁呢 --CSDN博客 总结一下 O/S 课程里面和锁相关的内容. 本文是 6.S0 ...

  7. 可重入锁 公平锁 读写锁、CLH队列、CLH队列锁、自旋锁、排队自旋锁、MCS锁、CLH锁

    1.可重入锁 如果锁具备可重入性,则称作为可重入锁. ========================================== (转)可重入和不可重入 2011-10-04 21:38 这 ...

  8. LINUX内核笔记:自旋锁

    目录 自旋锁作用与基本使用方法? 在SMP和UP上的不同表现? 自旋锁与上下文 使用spin_lock()后为什么不能睡眠? 强调:锁什么? 参考   1.自旋锁作用与基本使用方法? 与其他锁一样,自 ...

  9. linux线程同步(4)-自旋锁

    自旋锁与互斥量功能一样,唯一一点不同的就是互斥量阻塞后休眠让出cpu,而自旋锁阻塞后不会让出cpu,会一直忙等待,直到得到锁!!! 自旋锁在用户态使用的比较少,在内核使用的比较多!自旋锁的使用场景:锁 ...

随机推荐

  1. jenkins动态参数插件Dynamic Parameter安装及简单使用

    插件安装: 1.先下载插件hpi文件到本地   jenkins插件下载地址 http://mirror.xmission.com/jenkins/plugins/ http://updates.jen ...

  2. Java 读写Properties配置文件(转)

    转自:http://www.cnblogs.com/xudong-bupt/p/3758136.html

  3. for 与 for in

    在JavaScript中提供了两种方式迭代对象: (1)for 循环: (2)for..in循环: 使用for循环进行迭代数组对象,想必大家都已经司空见惯了.但是,使用for.. in循环时,大家可要 ...

  4. 思维+并查集 hdu5652

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5652 题意: 输入T,接下来T个样例,每个样例输入n,m代表图的大小,接下来n行,每行m个数,代表图, ...

  5. 最短路+叉积 poj1556

    题目链接:The Doors - POJ 1556 - Virtual Judge  https://vjudge.net/problem/POJ-1556 题意是叫我们计算从(0,5)到(10,5) ...

  6. Python+Selenium学习--启动及关闭浏览器

    场景 页面上弹出的对话框是自动化测试经常会遇到的一个问题:很多情况下对话框是一个iframe,如之前iframe介绍的例子,处理起来稍微有点麻烦:但现在很多前端框架的对话框是div 形式的,这就让我们 ...

  7. 颜色 color

    在res/values文件夹下的color.xml添加 <?xml version="1.0" encoding="utf-8"?> <res ...

  8. 定义一个servlet用于处理所有外部接口类 架构思路

    架构思路”: 所有外部URL访问请求(对外提供的接口)全部交给intServiceServlet处理, 然后servlet调用BPO通过URL中的命名去寻找相应的javaBean.接口BO,然后接口B ...

  9. const和volatile分析

    c语言中const修饰的变量是只读的,不能直接作为赋值号的左值,其本质还是变量:会占用内存空间:本质上const在编译器有用,运行时无用(还是可以通过指针改变它的值) ; int *p=&ab ...

  10. java_2变量和运算符

    1.变量 存储数据的容器. 2.变量创建的3要素 数据类型 变量名 = 变量值: 如int  a = 10; 3.数据类型的自动转化 当小范围变量向大范围变量转化的时候,会发生这种情况.如int类型变 ...