nginx自旋锁
#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自旋锁的更多相关文章
- Nginx学习之四-Nginx进程同步方式-自旋锁(spinlock)
自旋锁简介 Nginx框架使用了三种消息传递方式:共享内存.套接字.信号. Nginx主要使用了三种同步方式:原子操作.信号量.文件锁. 基于原子操作,nginx实现了一个自旋锁.自旋锁是一种非睡眠锁 ...
- 菜鸟nginx源代码剖析数据结构篇(十) 自旋锁ngx_spinlock
菜鸟nginx源代码剖析数据结构篇(十) 自旋锁ngx_spinlock Author:Echo Chen(陈斌) Email:chenb19870707@gmail.com Blog:Blog.cs ...
- 菜鸟nginx源码剖析数据结构篇(十) 自旋锁ngx_spinlock[转]
菜鸟nginx源码剖析数据结构篇(十) 自旋锁ngx_spinlock Author:Echo Chen(陈斌) Email:chenb19870707@gmail.com Blog:Blog.csd ...
- 可重入锁 & 自旋锁 & Java里的AtomicReference和CAS操作 & Linux mutex不可重入
之前还是写过蛮多的关于锁的文章的: http://www.cnblogs.com/charlesblc/p/5994162.html <[转载]Java中的锁机制 synchronized &a ...
- nginx的锁
一.原理 nginx的锁是基于共享内存实现的,这点跟redis中利用一个存储(也就是一个键值对)来实现锁的原理是一致的,每一项操作通过检查锁对象的lock域是否为0,来判断能否获取锁并尝试获取锁. 二 ...
- 从自旋锁、睡眠锁、读写锁到 Linux RCU 机制讲解
同步自我的 csdn 博客 6.S081 从自旋锁.睡眠锁.读写锁到 Linux RCU 机制讲解_我说我谁呢 --CSDN博客 总结一下 O/S 课程里面和锁相关的内容. 本文是 6.S0 ...
- 可重入锁 公平锁 读写锁、CLH队列、CLH队列锁、自旋锁、排队自旋锁、MCS锁、CLH锁
1.可重入锁 如果锁具备可重入性,则称作为可重入锁. ========================================== (转)可重入和不可重入 2011-10-04 21:38 这 ...
- LINUX内核笔记:自旋锁
目录 自旋锁作用与基本使用方法? 在SMP和UP上的不同表现? 自旋锁与上下文 使用spin_lock()后为什么不能睡眠? 强调:锁什么? 参考 1.自旋锁作用与基本使用方法? 与其他锁一样,自 ...
- linux线程同步(4)-自旋锁
自旋锁与互斥量功能一样,唯一一点不同的就是互斥量阻塞后休眠让出cpu,而自旋锁阻塞后不会让出cpu,会一直忙等待,直到得到锁!!! 自旋锁在用户态使用的比较少,在内核使用的比较多!自旋锁的使用场景:锁 ...
随机推荐
- native和webview切换
native和webview 标签(空格分隔): native和webview 现在目前大部分的app都是native和webview混合,对应的native上的元素可以通过uiautomatorvi ...
- 重工单001800020505在IN表IN_SFCHEADER被过滤 TEMP_REMOVED_ID_IN_DATA
select * from SAP_AFKO WHERE AUFNR='001800020505'; ---有数据SELECT * FROM IN_SFCHEADER WHERE MO_ID ='0 ...
- .net连接MySql 出错
1>C#连接MySQL异常:The host localhost does not support SSL connections. 需要在连接字符串加入:SslMode = none;即可解决 ...
- background和background-color的区别
在设置输入框变成一条线的样式时遇到一个小问题. 无论怎么设置 输入框的背景都没有变 而设置background: #aaa;背景就改变了. 后来发现原因 background 可以设置 背景颜色.背景 ...
- python if __name__ == 'main' 的作用和原理()
相信初学者在学习Python的过程中,不可避免的总会遇到 if __name__ == 'main'语句,虽然一直知道它的作用,但是可能一直比较模糊,今天菜鸟分析就与大家一起举例说说我的理解. 举个例 ...
- 静态方法调用内部类时候的new 问题
package tool; /** * 静态方法调用内部类时候的new 问题 */ public class aa { // 静态方法 // 静态方法new 有问题 public static voi ...
- unity3d英语单词拼写小游戏Pics Quiz Maker With Categories 3.0
下载地址: https://item.taobao.com/item.htm?spm=0.7095261.0.0.19f71debcef4hT&id=575991216080
- Codeforces Beta Round #55 (Div. 2)
Codeforces Beta Round #55 (Div. 2) http://codeforces.com/contest/59 A #include<bits/stdc++.h> ...
- 24 【python入门指南】class
一.类 1.1,构造函数,析构函数 #!/bin/python class dog(): def __init__(self, age, name): self.age = age self.name ...
- selenimu学习二
1.上传文件 from selenium import webdriver import time import os driver = webdriver.Chrome() src_file = & ...