我有一个文件名数组,每个进程只需要创建和写入一个文件.

这就是我的意思:

foreach ($filenames as $VMidFile) {
    if (file_exists($VMidFile)) { // A
        continue;
    }

    $fp = fopen($VMidFile,'c'); // B

    if (!flock($fp,LOCK_EX | LOCK_NB)) { // C
        continue;
    }

    if (!filesize($VMidFile)) { // D
        // write to the file;

        flock($fp,LOCK_UN);
        fclose($fp);
        break;
    }

    flock($fp,LOCK_UN);
    fclose($fp); // E
}

但我不喜欢我依赖文件大小.

有什么建议以另一种(更好的)方式做到这一点?

UPD:添加标签以便轻松讨论

UPD 2:我正在使用filesize,因为我没有看到任何其他可靠的方法来检查当前线程是否创建了文件(因此它还是空的)

UPD 3:解决方案应该是无条件竞赛.

一个可能的,稍微丑陋的解决方案是锁定一个锁文件,然后测试该文件是否存在:
$lock = fopen("/tmp/".$filename."LOCK","w"); // A

if (!flock($lock,LOCK_EX)) { // B
    continue;
}
if(!file_exists($filename)){ // C
    //File doesn't exist so we kNow that this thread will create it
    //Do stuff to $filename
    flock($lock,LOCK_UN); // D
    fclose($lock);
}else{
    //File exists. This thread didn't create it (at least in this iteration).
    flock($lock,LOCK_UN);
    fclose($lock);
}

这应该允许对文件的独占访问,并且还允许决定是否调用fopen($VMidFile,’c’);将创建该文件.

php – 以线程安全的方式创建文件的更多相关文章

  1. ios – Realm Swift模型是否分开?

    我是iOS和Swift的世界的新手,正在开发一个新的应用程序,我想使用领域来保持持久性.我的代码中已经有我的服务访问和填充HTTPAPI端点的实体.现在我想坚持一些实体,并且想要建议我是否应该为每个实体创建新的领域特定的模型,以便从领域读写.或者我应该将我现有的所有简单的Swift实体转换为国家实体.起初,我感觉到错误,因为我将在我的应用程序中传递RealmEntities,而不是在持久层中.但是

  2. “Flock”iOS应用程序如何检测拍摄照片的时间?

    Flock是一个相当新的iOS应用程序,来自Bump的人,它有一个有趣的功能.它以某种方式知道其他应用程序何时拍摄照片,通知用户,并要求用户将其分享到相册中.当然还有其他有趣的功能,但我对我正在开发的另一个应用程序的这个功能特别感兴趣.我无法看到API如何直接促进这一点.我仔细查看了通知api文档,应用程序当然可以注册以在将来的日期/时间向用户显示通知,因此当时用户可以打开…

  3. 在Swift中应用Grand Central Dispatch(上

    在这两篇教程中,你会学到GCD的来龙去脉。起步libdispatch是Apple所提供的在IOS和OSX上进行并发编程的库,而GCD正是它市场化的名字。Swift中的闭包和OC中的块类似甚至于他们几乎就是可交换使用的。但OC中的块可以安全的替换成Swift中的闭包。再一次,这完全取决于GCD。QoS等级表示了提交任务的意图,使得GCD可以决定如何制定优先级。QOS_CLASS_USER_INteraCTIVE:userinteractive等级表示任务需要被立即执行以提供好的用户体验。

  4. 【荐】Grand Central Dispatch Tutorial for Swift: Part 1/2

    所有的dispatchqueues自身都是线程安全的。dispatch_sync把任务添加到对应队列并等待其完成后再继续执行当前任务,容易造成死锁,或阻塞当前任务。dispatch_after指定时间后把任务添加到队列中。效果就像是延时后的dispatch_async。而array和dictionary在swift中是以struct的形式实现的,所以以上的读操作返回的是一个副本。在GCD中使用dispatchbarrier来解决这个问题。dispatchbarrier是一组方法,它们都已顺序化的方式来结合

  5. swift详解之十六-----------GCD基础部分

    当你了解了调度队列如何为你自己代码的不同部分提供线程安全后,GCD的优点就是显而易见的。这完全取决于GCD。这个队列就是用于发生消息给UIView或发送通知的。GCD的“艺术”归结为选择合适的队列来调度函数以提交你的工作。

  6. Swift多种实现单例写法

    学习Swift的单例写法,以下提供了5种方式,一起来看看吧!

  7. Swift线程安全详解-概念,三种锁,死锁,Atomic,synchronized

    研究了下,是线程安全问题。UIKit以及Fundation事实上,大多数Cocoa提供的Api都不是线程安全的,尤其是与UI相关的UIKit,只能在主线程上操作。需要线程安全的时候,开发者自己维护就可以了。用来加锁,解锁。关于ObjectiveC参考这篇文章Atomic一个非Atomic的属性在非ARC的时候像这样可以看到,如果在多线程同时set的情况下,可能会造成release两次。Property的Runtime对应的C代码为可以看到,如果是nonatomic的,synchronized可以看看这个S

  8. swift - singleton

    关于单例,有三个重要的准则需要牢记:单例必须是唯一的,在程序生命周期中只能存在一个这样的实例。单例的存在使我们可以全局访问状态。为保证单例的唯一性,单例类的初始化方法必须是私有的。这样就可以避免其他对象通过单例类创建额外的实例。通过调用dispatch_once,即可保证实例化代码只运行一次。

  9. Swift线程安全的单例实现

    介绍单例模式在开发中尤为常见,最大的好处就是内存中只会保留一个对象,节省内存开销,同时便于对象的建立和维护。一个简单的单例这个单例,如此的简单那么他是线程安全的吗?答案是—————是!原因很简单,let定义的属性本身就是threadsafe的,同时static定义的是一个classconstant,拥有全局作用域和懒加载特性。如果你是Swift1.2以下的你可以这么写用GCD来实现线程安全这个实现大家应该相当熟悉,这里就不再过多介绍了。

  10. Swift 线程安全数组

    有并发的地方就存在线程安全问题,尤其是对于Swift这种还没有内置并发支持的语言来说线程安全问题更为突出。下面我们通过常见的数组操作来分析其中存在的线程问题,以及如何实现一个线程安全数组。因为对于值类型来说Swift采用的是copyOnWrite机制,所以在进行copyOnWrite处理是可能数组已经被另一个写操作给修改了。

随机推荐

  1. PHP个人网站架设连环讲(一)

    先下一个OmnihttpdProffesinalV2.06,装上就有PHP4beta3可以用了。PHP4给我们带来一个简单的方法,就是使用SESSION(会话)级变量。但是如果不是PHP4又该怎么办?我们可以假设某人在15分钟以内对你的网页的请求都不属于一个新的人次,这样你可以做个计数的过程存在INC里,在每一个页面引用,访客第一次进入时将访问时间送到cookie里。以后每个页面被访问时都检查cookie上次访问时间值。

  2. PHP函数学习之PHP函数点评

    PHP函数使用说明,应用举例,精简点评,希望对您学习php有所帮助

  3. ecshop2.7.3 在php5.4下的各种错误问题处理

    将方法内的函数,分拆为2个部分。这个和gd库没有一点关系,是ecshop程序的问题。会出现这种问题,不外乎就是当前会员的session或者程序对cookie的处理存在漏洞。进过本地测试,includes\modules\integrates\ecshop.php这个整合自身会员的类中没有重写integrate.php中的check_cookie()方法导致,验证cookie时返回的username为空,丢失了登录状态,在ecshop.php中重写了此方法就可以了。把他加到ecshop.php的最后面去就可

  4. NT IIS下用ODBC连接数据库

    $connection=intodbc_connect建立数据库连接,$query_string="查询记录的条件"如:$query_string="select*fromtable"用$cur=intodbc_exec检索数据库,将记录集放入$cur变量中。再用while{$var1=odbc_result;$var2=odbc_result;...}读取odbc_exec()返回的数据集$cur。最后是odbc_close关闭数据库的连接。odbc_result()函数是取当前记录的指定字段值。

  5. PHP使用JpGraph绘制折线图操作示例【附源码下载】

    这篇文章主要介绍了PHP使用JpGraph绘制折线图操作,结合实例形式分析了php使用JpGraph的相关操作技巧与注意事项,并附带源码供读者下载参考,需要的朋友可以参考下

  6. zen_cart实现支付前生成订单的方法

    这篇文章主要介绍了zen_cart实现支付前生成订单的方法,结合实例形式详细分析了zen_cart支付前生成订单的具体步骤与相关实现技巧,需要的朋友可以参考下

  7. Thinkphp5框架实现获取数据库数据到视图的方法

    这篇文章主要介绍了Thinkphp5框架实现获取数据库数据到视图的方法,涉及thinkPHP5数据库配置、读取、模型操作及视图调用相关操作技巧,需要的朋友可以参考下

  8. PHP+jquery+CSS制作头像登录窗(仿QQ登陆)

    本篇文章介绍了PHP结合jQ和CSS制作头像登录窗(仿QQ登陆),实现了类似QQ的登陆界面,很有参考价值,有需要的朋友可以了解一下。

  9. 基于win2003虚拟机中apache服务器的访问

    下面小编就为大家带来一篇基于win2003虚拟机中apache服务器的访问。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  10. Yii2中组件的注册与创建方法

    这篇文章主要介绍了Yii2之组件的注册与创建的实现方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下

返回
顶部