zoukankan      html  css  js  c++  java
  • php用apc实现的临界区 解决并发,资源互斥同步访问

    在面对线程或进程的互斥同步的控制问题时,常用的解决办法是:临界区,互斥锁,信号量

    临界区保证在某一时刻只有一个线程能够访问到所需资源的方法。

    任何时候,只能至多有一个线程处于临界区中。如果多个线程要求进入临界区去访问所需资源,那么在临界区空闲时只允许一个线程进入。若已有线程在临界区内,那么其他的线程必须等待,直到进入的线程离开(应该在限制时间内离开)。离开后,其他线程继续抢占。

    临界区与互斥锁相似,但实现起来比较简单,当然面对的问题也没有互斥锁复杂。这里就不展开讨论以上几者的区别了。

    对于php应用,更多的情况是由并发引起的资源抢占。

    我们利用APC缓存来实现临界区,是基于apc_inc()和apc_dec()这两个函数都是原子操作的特性。

    <?php
    /**
     * 如果您的 PHP 不支持APC,请安装APC扩展
     */
    if (!function_exists('apc_exists')) {
    	echo ('This demo needs the APC PHP extension.');
    	exit;
    }
    
    $key = 'test';
    CS_Enter($key);
    //do something here
    CS_Leave($key);
    
    /**
    * 进入临界区
    */
    function CS_Enter($key) {
    	$key = '_cs_' . $key;
    	if (!apc_exists($key)) {
    		apc_add($key, 0);
    	}
    	while (apc_inc($key) != 1) {
    		apc_dec($key);
    		usleep(10000);	// 10ms
    	}
    }
    
    /**
    *离开临界区
    */
    function CS_Leave($key) {
    	apc_dec('_cs_' . $key);
    }
    ?>


  • 相关阅读:
    Java网络编程详解
    android 取mac若干问题
    android问题 This version of android studio is incompatible with the gradle version used.
    c#将DataTable内容导出为CSV文件
    C#下利用正则表达式实现字符串搜索功能的方法(转)
    C#正则表达式入门
    java 文件类 null与exists()是不一样的
    c#线程中下载文件到本地
    Git 常用命令
    Web 监听器
  • 原文地址:https://www.cnblogs.com/riskyer/p/3241593.html
Copyright © 2011-2022 走看看