
互斥锁(mutex) 通过锁机制实现线程间的同步。
1、初始化锁。在Linux下,线程的互斥量数据类型是pthread_mutex_t。在使用前,要对它进行初始化。
2、静态分配:pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER
3、动态分配:int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutex_attr_t *mutexattr)
4、加锁。对共享资源的访问,要对互斥量进行加锁,如果互斥量已经上了锁,调用线程会阻塞,直到互斥量被解锁。
int pthread_mutex_lock(pthread_mutex *mutex)int pthread_mutex_trylock(pthread_mutex_t *mutex)
解锁。在完成了对共享资源的访问后,要对互斥量进行解锁。
int pthread_mutex_unlock(pthread_mutex_t *mutex)
销毁锁。锁在是使用完成后,需要进行销毁以释放资源。
int pthread_mutex_destroy(pthread_mutex *mutex)
#include <cstdio>
#include <cstdlib>
#include <unistd.h>
#include <pthread.h>
#include "iostream"
using namespace std
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER
int tmp
void* thread(void *arg)
{
cout << "thread id is " << pthread_self() << endl
pthread_mutex_lock(&mutex)
tmp = 12
cout << "Now a is " << tmp << endl
pthread_mutex_unlock(&mutex)
return NULL
}
int main()
{
pthread_t id
cout << "main thread id is " << pthread_self() << endl
tmp = 3
cout << "In main func tmp = " << tmp << endl
if (!pthread_create(&id, NULL, thread, NULL))
{
cout << "Create thread success!" << endl
}
else
{
cout << "Create thread failed!" << endl
}
pthread_join(id, NULL)
pthread_mutex_destroy(&mutex)
return 0
}
//编译:g++ -o thread testthread.cpp -lpthread
首先初始化的锁为全局变量,为所有线程共享,你一个线程得到锁后自然而然就将其他线程阻塞了嘛,解锁后其他线程才能获取锁,理解哪个锁是一个阻塞性函数就ok,何必纠结呢,具体深挖掘的话就可以参照Linux环境高级编程了!PHP语言本身是不支持多线程的。网上关于PHP模拟多线程的方法,都是利用了LINUX和APACHE等本身所具有的多线程能力。既然是模拟的,就不是真正的多线程,其实只是多进程。1. 利用LINUX *** 作系统
<?php
for ($i=0$i<10$i++) {
echo $i
sleep(5)
}
?>
上面存成test.php, 然后写一段SHELL代码
#!/bin/bash
for i in 1 2 3 4 5 6 7 8 9 10
do
php -q test.php &
done
2. 利用fork子进程(其实同样是利用LINUX *** 作系统)
<?php
declare(ticks=1)
$bWaitFlag = FALSE/// 是否等待进程结束
$intNum = 10 /// 进程总数
$pids = array() /// 进程PID数组
echo ("Startn")
for($i = 0$i <$intNum$i++) {
$pids[$i] = pcntl_fork()/// 产生子进程,而且从当前行之下开试运行代码,而且不继承父进程的数据信息
if(!$pids[$i]) {
// 子进程进程代码段_Start
$str=""
sleep(5+$i)
for ($j=0$j<$i$j++) {$str.="*"}
echo "$i ->" . time() . " $str n"
exit()
// 子进程进程代码段_End
}
}
if ($bWaitFlag)
{
for($i = 0$i <$intNum$i++) {
pcntl_waitpid($pids[$i], $status, WUNTRACED)
echo "wait $i ->" . time() . "n"
}
}
echo ("Endn")
?>
3. 利用WEB SERVER, PHP不支持多线程, APACHE可是支持的, 呵呵.
假设我们现在运行的是a.php这个文档. 但是我在程式中又请求WEB服务器运行另一个b.php
那么这两个文档将是同时执行的.
<?php
function runThread()
{
$fp = fsockopen('localhost', 80, $errno, $errmsg)
fputs($fp, "GET /a.php?act=brnrn")
fclose($fp)
}
function a()
{
$fp = fopen('result_a.log', 'w')
fputs($fp, 'Set in ' . Date('h:i:s', time()) . (double)microtime() . "rn")
fclose($fp)
}
function b()
{
$fp = fopen('result_b.log', 'w')
fputs($fp, 'Set in ' . Date('h:i:s', time()) . (double)microtime() . "rn")
fclose($fp)
}
if(!isset($_GET['act'])) $_GET['act'] = 'a'
if($_GET['act'] == 'a')
{
runThread()
a()
}
else if($_GET['act'] == 'b') b()
?>
也可以把需要多线程处理的部分交给JAVA去处理,然后在PHP里调用。
<?php
system('java multiThread.java')
?>
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)