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.iniadd:
extension=pthreads.so
cd examples/usr/local/php-zts/bin/php Mutexes.php
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,则是同时多线程执行的。