pthreads 2.0.10 test

本文详细介绍了如何在PHP环境下通过pthread库实现线程同步与并发操作,包括下载、安装PHP和pthread库,配置环境变量,编写并发程序以展示线程同步的重要性。

CentOS 6.3


cd /root

mkdir pthreads

//get php-5.6 and install zts version

wget cn2.php.net/get/php-5.6.11.tar.gz/from/this/mirror
tar zxf /php-5.6.11.tar.gz
cd /php-5.6.11
./configure --prefix=/usr/local/php-zts --with-config-file-path=/usr/local/php-zts/etc --enable-fpm --with-fpm-user=apache --with-fpm-group=apache --enable-mbstring --enable-xml --with-mysql --with-mysqli --with-iconv-dir --enable-maintainer-zts --enable-zip --enable-pcntl --enable-sockets
make
make install


//get pthreads

wget http://pecl.php.net/get/pthreads
tar zxf pthreads-2.0.10.tgz
cd pthreads-2.0.10
./configure --with-php-config=/usr/local/php-zts/bin/php-confi
make
make install
vi /usr/local/php-zts/etc/php.ini

add:

extension=pthreads.so


cd examples

/usr/local/php-zts/bin/php Mutexes.php



<?php
/* this seems like a pretty good way to show you the difference between threads that are syncrhonized with mutex and those that aren't */
/* will show 50 very neat rows <-.........-> then 50 threads doing the same thing with no mutex */
class MyWorkerThread extends Thread {
	public function __construct($limit, $mutex, $id){
		$this->limit = $limit;
		$this->mutex = $mutex;
		$this->id = $id;
	}

	public function run(){
		if($this->mutex)
			$locked=Mutex::lock($this->mutex);
		printf("%s#%lu:<-", !empty($locked)?"Y":"N", $this->id);
		$i=0;
		sleep(rand(1,3));
		while($i++<$this->limit){
			echo ".";
		}
		printf("->\n");
		if($this->mutex)
			Mutex::unlock($this->mutex);
		return true;
	}
}

$timer = microtime(true);
/* create and lock a mutex */
$mutex = Mutex::create(true);
/* create workers */
$workers = array();
for($i=0;$i<10;$i++){
	$workers[$i]=new MyWorkerThread(rand(30, 100), $mutex,$i);
	/* they cannot go anywhere, I have the mutex */
	$workers[$i]->start();
}
printf("Release the (muzzled) hounds ... :\n");
Mutex::unlock($mutex);
foreach($workers as $i=> $worker)
	$workers[$i]->join();
printf("Muzzled: %f seconds\n", microtime(true)-$timer);
/* please remember to destroy mutex and condition variables */
Mutex::destroy($mutex);

$timer = microtime(true);
/* same again, no mutex */
printf("Now no mutex ... :\n");
$workers = array();
for($i=0;$i<10;$i++){
	$workers[$i]=new MyWorkerThread(rand(30, 100),null,$i);
	/* they cannot go anywhere, I have the mutex */
	$workers[$i]->start();
}
foreach($workers as $worker)
	$worker->join();
printf("Dribbling: %f seconds\n", microtime(true)-$timer);
?>

改了一下,可以明显看到用了Mute会是按照顺序执行,而不用Mute,则是同时多线程执行的。


转载于:https://www.cnblogs.com/lein317/p/5067520.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值