swoole 잠 금 메커니즘 코드 인 스 턴 스 설명
swoole_lock 클래스 는 5 가지 잠 금 형식 을 지원 합 니 다:
파일 잠 금 SWOOLEFILELOCK 읽 기와 쓰기 자물쇠 SWOOLERWLOCK 신 호 량 SWOOLESEM
swoole_lock->__construct(int $type, [string $lockfile])
$type 잠 금 형식$lockfile,형식 은 SWOOLEFILELOCK 에 들 어 갈 때 파일 잠 금 경 로 를 지정 해 야 합 니 다.
이 자물쇠 의 실현 을 소개 하 겠 습 니 다.
static PHP_METHOD(swoole_lock, __construct)
{
long type = SW_MUTEX;
char *filelock;
zend_size_t filelock_len = 0;
int ret;
// , 2 , type , ( ), ,
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|ls", &type, &filelock, &filelock_len) == FAILURE)
{
RETURN_FALSE;
}
// ,
swLock *lock = SwooleG.memory_pool->alloc(SwooleG.memory_pool, sizeof(swLock));
if (lock == NULL)//
{
zend_throw_exception(swoole_exception_class_entry_ptr, "global memory allocation failure.", SW_ERROR_MALLOC_FAIL TSRMLS_CC);
RETURN_FALSE;
}
switch(type)// type ,
{
#ifdef HAVE_RWLOCK
case SW_RWLOCK://
ret = swRWLock_create(lock, 1);// ,
break;
#endif
case SW_FILELOCK://
if (filelock_len <= 0)//
{
zend_throw_exception(swoole_exception_class_entry_ptr, "filelock requires file name of the lock.", SW_ERROR_INVALID_PARAMS TSRMLS_CC);
RETURN_FALSE;
}
int fd;
if ((fd = open(filelock, O_RDWR | O_CREAT, 0666)) < 0) // linux open, ( )
{
zend_throw_exception_ex(swoole_exception_class_entry_ptr, errno TSRMLS_CC, "open file[%s] failed. Error: %s [%d]", filelock, strerror(errno), errno);
RETURN_FALSE;
}
ret = swFileLock_create(lock, fd);// ,
break;
case SW_SEM:
ret = swSem_create(lock, IPC_PRIVATE);// ,
break;
#ifdef HAVE_SPINLOCK
case SW_SPINLOCK:
ret = swSpinLock_create(lock, 1);// ,
break;
#endif
case SW_MUTEX:
default:
ret = swMutex_create(lock, 1);// ,
break;
}
if (ret < 0)
{
zend_throw_exception(swoole_exception_class_entry_ptr, "failed to create lock.", errno TSRMLS_CC);
RETURN_FALSE;
}
swoole_set_object(getThis(), lock);//PHP swoole
RETURN_TRUE;
}
다음은 각각 다른 잠 금 대상 의 생 성 과정 을 소개 한다.1.읽 기와 쓰기 자물쇠
int swRWLock_create(swLock *lock, int use_in_process)
{
int ret;
bzero(lock, sizeof(swLock));//
lock->type = SW_RWLOCK;//
pthread_rwlockattr_init(&lock->object.rwlock.attr);//linux ,
if (use_in_process == 1)// , pthread linux
{
// ,
pthread_rwlockattr_setpshared(&lock->object.rwlock.attr, PTHREAD_PROCESS_SHARED);
}
if ((ret = pthread_rwlock_init(&lock->object.rwlock._lock, &lock->object.rwlock.attr)) < 0)//linux ,
{
return SW_ERR;
}
/*
*
*/
lock->lock_rd = swRWLock_lock_rd;
lock->lock = swRWLock_lock_rw;
lock->unlock = swRWLock_unlock;
lock->trylock = swRWLock_trylock_rw;
lock->trylock_rd = swRWLock_trylock_rd;
lock->free = swRWLock_free;
return SW_OK;
}
2.파일 잠 금.
int swFileLock_create(swLock *lock, int fd)
{
bzero(lock, sizeof(swLock));//
lock->type = SW_FILELOCK;//
/*
*
*/
lock->object.filelock.fd = fd;
lock->lock_rd = swFileLock_lock_rd;
lock->lock = swFileLock_lock_rw;
lock->trylock_rd = swFileLock_trylock_rd;
lock->trylock = swFileLock_trylock_rw;
lock->unlock = swFileLock_unlock;
lock->free = swFileLock_free;
return 0;
}
3.신 호 량 잠 금
int swSem_create(swLock *lock, key_t key)
{
int ret;
lock->type = SW_SEM;//
if ((ret = semget(key, 1, IPC_CREAT | 0666)) < 0)// , IPC_CREAT,
{
return SW_ERR;
}
if (semctl(ret, 0, SETVAL, 1) == -1)// ret 1
{
swWarn("semctl(SETVAL) failed");
return SW_ERR;
}
lock->object.sem.semid = ret;// ID
/*
*
*/
lock->lock = swSem_lock;
lock->unlock = swSem_unlock;
lock->free = swSem_free;
return SW_OK;
}
4.낙 관 자물쇠
int swSpinLock_create(swLock *lock, int use_in_process)
{
int ret;
bzero(lock, sizeof(swLock));//
lock->type = SW_SPINLOCK;//
// ,
if ((ret = pthread_spin_init(&lock->object.spinlock.lock_t, use_in_process)) < 0)
{
return -1;
}
/*
*
*/
lock->lock = swSpinLock_lock;
lock->unlock = swSpinLock_unlock;
lock->trylock = swSpinLock_trylock;
lock->free = swSpinLock_free;
return 0;
}
5.상호 배척 자물쇠
int swMutex_create(swLock *lock, int use_in_process)
{
int ret;
bzero(lock, sizeof(swLock));
lock->type = SW_MUTEX;
pthread_mutexattr_init(&lock->object.mutex.attr);
if (use_in_process == 1)
{
pthread_mutexattr_setpshared(&lock->object.mutex.attr, PTHREAD_PROCESS_SHARED);
}
if ((ret = pthread_mutex_init(&lock->object.mutex._lock, &lock->object.mutex.attr)) < 0)
{
return SW_ERR;
}
lock->lock = swMutex_lock;
lock->unlock = swMutex_unlock;
lock->trylock = swMutex_trylock;
lock->free = swMutex_free;
return SW_OK;
}
swoole 잠 금 의 메커니즘 코드 인 스 턴 스 에 대한 설명 은 여기까지 입 니 다.swoole 잠 금 에 관 한 더 많은 메커니즘 내용 은 예전 의 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 응원 부탁드립니다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
tcp 서버 만들기/** * Created by PhpStorm. * User: Administrator * Date: 2018/4/3 * Time: 16:00 */ //创建服务器 TCP服务器 $serv = new swoole_ser...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.