php Pthread 多线程 (三) Mutex 互斥量
<?php
class Add extends Thread {
private $name = '';
private $res = null;
private $mutex = null; public function __construct($name, $res, $mutex = null) {
$this->name = $name;
$this->res = $res;
$this->mutex = $mutex;
} public function run() {
if($this->mutex) {
//给互斥量加锁
Mutex::lock($this->mutex);
}
//从文件中获取数据
$data = trim(fgets($this->res));
$data = intval($data);
++$data;
//重置文件指针到开始处
fseek($this->res, 0);
//写入数据
fwrite($this->res, $data);
//重置文件指针
fseek($this->res, 0);
echo "Thread {$this->name} add {$data} \r\n";
if($this->mutex) {
//给互斥量解锁
Mutex::unlock($this->mutex);
}
}
} $fp = fopen('./add.txt', 'r+'); //创建互斥量,立即加锁
$mutex = Mutex::create(true); $threads = array();
for($ix = 0; $ix < 20; ++$ix) {
$thread = new Add($ix, $fp, $mutex);
$thread->start();
$threads[] = $thread;
} Mutex::unlock($mutex); foreach($threads as $thread) {
$thread->join();
} //销毁互斥量
Mutex::destroy($mutex);
当第一个线程给互斥量加锁后,如果在操作期间,其他线程再次给互斥量加锁,会导致线程进入阻塞状态,直到互斥量被解锁。这就很好的保护了文件在同一时间内只能被一个线程操作。
php Pthread 多线程 (三) Mutex 互斥量的更多相关文章
- [一个经典的多线程同步问题]解决方案三:互斥量Mutex
本篇通过互斥量来解决线程的同步,学习其中的一些知识. 互斥量也是一个内核对象,它用来确保一个线程独占一个资源的访问.互斥量与关键段的行为非常相似,并且互斥量可以用于不同进程中的线程互斥访问资源.使用互 ...
- Linux并发与同步专题 (4) Mutex互斥量
关键词:mutex.MCS.OSQ. <Linux并发与同步专题 (1)原子操作和内存屏障> <Linux并发与同步专题 (2)spinlock> <Linux并发与同步 ...
- C++多线程同步之Mutex(互斥量)
原文链接: http://blog.csdn.net/olansefengye1/article/details/53086141 一.互斥量Mutex同步多线程 1.Win32平台 相关函数和头文件 ...
- c# Thread5——线程同步之基本原子操作。Mutex互斥量的使用
之前的博文也说到了如果多线程对于访问的公共资源操作都是原子操作,那么可以避免竞争条件.关于多线程的竞争可以百度. 1.执行最基本的原子操作 c#提供了一系列供我们使用的原子操作的方法和类型,比如我们的 ...
- 【Linux】Mutex互斥量线程同步的例子
0.互斥量 Windows下的互斥量 是个内核对象,每次WaitForSingleObject和ReleaseMutex时都会检查当前线程ID和占有互斥量的线程ID是否一致. 当多次Wait**时就 ...
- C++并发与多线程学习笔记--互斥量、用法、死锁概念
互斥量(mutex)的基本概念 互斥量的用法 lock(), unlock() std::lock_guard类模板 死锁 死锁演示 死锁的一般解决方案 std::lock()函数模板 std::lo ...
- C++多线程框架-----Mutex互斥和Sem信号量
互斥和信号量是多线程编程的两个基础,其原理就不详细说了,大家去看看操作系统的书或者网上查查吧. 对于互斥的实现,无论什么操作系统都离不开三个步骤 1.初始化互斥锁 2.锁操作 3.解锁操 ...
- mutex 互斥量
有用参考:http://blog.csdn.net/yl2isoft/article/details/46003467 摘抄记录:using System.Threading; class Examp ...
- 多线程面试题系列(7):经典线程同步 互斥量Mutex
前面介绍了关键段CS.事件Event在经典线程同步问题中的使用.本篇介绍用互斥量Mutex来解决这个问题. 互斥量也是一个内核对象,它用来确保一个线程独占一个资源的访问.互斥量与关键段的行为非常相似, ...
随机推荐
- pycharm格式报错: Remove redundant parentheses
处理:所在代码行,最外层括号去掉
- python高亮显示输出
知识内容: 1.高亮输出语法 2.高亮输出实例 前言: 在做购物车这道题时遇到了高亮显示输出某些内容的需求,于是就学了一下这方面的知识,以下是python高亮显示输出的使用方法: 购物车链接: ht ...
- Pillow 读取图片截断错误
做图像处理的时候,Pillow是经常使用到的模块. 最近在读取图片的时候出现了一个错误. OSError: image file is truncated (461 bytes not process ...
- 4. 纯 CSS 创作一个金属光泽 3D 按钮特效
原文地址:https://segmentfault.com/a/1190000014599280 HTML代码: <div class="box">BUTTON< ...
- leetcode748
public class Solution { public string ShortestCompletingWord(string licensePlate, string[] words) { ...
- eclipse override报错
转自:https://www.cnblogs.com/libra0920/p/6408891.html 错误: 在 eclipse 的新工作空间开发项目时,出现大面积方法编译错误.鼠标放在方法名上后显 ...
- RAD 10 C++Builder的bug
C++Builder的bug 修改一行代码,F9会报错.要clear工程重新完整编译才可以. 新建空白工程是好的. restart computer ok!!! 2)fdquery like this ...
- delphi Firemonkey ListBoxItem自绘
delphi Firemonkey ListBoxItem自绘 ListBoxItem1的事件ListBoxItem1Paint procedure TForm1.ListBoxItem1Paint( ...
- DataSnap高级技术(7)—TDSServerClass中Lifecycle生命周期三种属性说明
From http://blog.csdn.net/sunstone/article/details/5282666 DataSnap高级技术(7)—TDSServerClass中Lifecycle生 ...
- python常见异常提示
PEP8 expected 2 blank lines, found 1 定义方法时,出现期望是2个空白行,但是实际检测到是1个.方法与上面内容间隔期望为两个换行符 PEP8 This diction ...