nginx中的多线程时间更新模型
在nginx中,ngx_time_update函数可以被多个线程执行,但只要有一个线程执行了这个函数,其他线程无需执行这个函数。
对于这种需求,nginx给出的实现方案挺有意思。
ngx_time_update开头两句如下:
if (!ngx_trylock(&ngx_time_lock)) { return; } // do something... ngx_unlock(&ngx_time_lock);
ngx_trylock和ngx_unlock都是宏定义,代码如下:
#define ngx_trylock(lock) (*(lock) == 0 && ngx_atomic_cmp_set(lock, 0, 1)) #define ngx_unlock(lock) *(lock) = 0
#define ngx_atomic_cmp_set(lock, old, set) \ ((ngx_atomic_uint_t) InterlockedCompareExchange((long *) lock, set, old) \ == old)
ngx_atomic_uint_t是unsigned int的类型别名。
至此,可以看出这种同步方案是使用InterlockedCompareExchange实现的。
首先,Interlocked系列函数能够保证操作的原子性。
假设现在ngx_time_lock变量的值为0,有两个线程都要执行InterlockedCompareExchange这个函数了。此时,只会有一个线程先执行,它改变了ngx_time_lock的值为1,并返回0。另外一个线程用新的ngx_time_lock值(也就是1)跟0进行比较,此时,不会发生交换,并且返回原始的值1,保证这个线程在if判断处返回。
另外,ngx_atomic_t的类型定义为:typedef volatile unsigned int ngx_atomic_t;
以上就介绍了nginx中的多线程时间更新模型,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

热门话题

我们今天主要是来看一看golang time 包的时间应用方式。两者的一般规则是「wall time」用于告知时间,而「monotonic clock」用于测量时间;除外还有其他的时钟处理方式。

Jdk1.5以后,在java.util.concurrent.locks包下,有一组实现线程同步的接口和类,说到线程的同步,可能大家都会想到synchronized关键字,这是java内置的关键字,用来处理线程同步的,但这个关键字有很多的缺陷,使用起来也不是很方便和直观,所以就出现了Lock,下面,我们就来对比着讲解Lock。通常我们在使用synchronized关键字的时候会遇到下面这些问题:(1)不可控性,无法做到随心的加锁和释放锁。(2)效率比较低下,比如我们现在并发的读两个文件,读与读之

1.概述作为本文的一部分,让我们从现有Date和CalendarAPI存在的一些问题入手,来探讨新的Java8Date和TimeAPI如何解决这些问题。我们还将搞一搞Java8时间类库中的核心类,比如LocalDate,LocalTime,LocalDateTime,ZonedDateTime,Period,Duration以及它们的api。2.旧的时间API(java8之前)的问题线程安全-Date和Calendar类不是线程安全的,使开发者难以调试这些api的并发问题,需要编写额外的代码来处

1.作用(1)Lock方式来获取锁支持中断、超时不获取、是非阻塞的(2)提高了语义化,哪里加锁,哪里解锁都得写出来(3)Lock显式锁可以给我们带来很好的灵活性,但同时我们必须手动释放锁(4)支持Condition条件对象(5)允许多个读线程同时访问共享资源2.lock用法//获取锁voidlock()//如果当前线程未被中断,则获取锁voidlockInterruptibly()//返回绑定到此Lock实例的新Condition实例ConditionnewCondition()//仅在调用时锁

说明1、Lock是java.util.concurent包下的接口,定义了一系列的锁定操作方法。2、Lock界面主要包括ReentrantLock、ReentrantReadWriteLock、ReentrantReadWriteLock、WriteLock实现类。与Synchronized不同,Lock提供了获取锁、释放锁等相关界面,使其使用更加灵活,操作更加复杂。实例ReentrantReadWriteLocklock=newReentrantReadWriteLock();Lockread

一.Python中表示时间的两种方式:时间戳:相对于1970.1.100:00:00以秒计算的偏移量,唯一的时间元组struct_time:共有9个元素>tm_year:年1-12>tm_mon:月1-12>tm_mday:日1-31>tm_hour:时0-23>tm_min:分0-59>tm_sec:秒0-59>tm_wday:星期0-6(0表示周日)>tm_day:一年中的第几天1-366>tm_isdst:是否是夏令,默认为-1二.ti

Pythontime模块时间获取和转换Python的Time库可以进行时间相关的处理,如访问当前日期和时间,输出不同格式的时间以及等待指定的时间等。1.获取时间1.1.时间戳importtimetimestamp=time.time()#1682737552.5009851格林威治时间(GMT)1970年01月01日00时00分00秒起至现在的总秒数1.2.结构化时间importtimestruct_time=time.localtime()#time.struct_time(tm_year=2

摘要:在Java中提供了synchronized关键字来保证只有一个线程能够访问同步代码块。既然已经提供了synchronized关键字,那为何在Java的SDK包中,还会提供Lock接口呢?这是不是重复造轮子,多此一举呢?今天,我们就一起来探讨下这个问题。在Java中提供了synchronized关键字来保证只有一个线程能够访问同步代码块。既然已经提供了synchronized关键字,那为何在Java的SDK包中,还会提供Lock接口呢?这是不是重复造轮子,多此一举呢?今天,我们就一起来探讨下
