swoole 잠 금 메커니즘 코드 인 스 턴 스 설명

7032 단어 swoole자물쇠.
자물쇠,이 단 어 는 우리 가 낯 설 지 않 고 주요 응용 장면 은 높 은 곳 에서 발생 하여 자 물 쇠 를 만든다.오늘 의 이 글 은 주로 swoole 의 자물쇠 메커니즘,swoolelock 은 어떻게 이 루어 졌 습 니까?
swoole_lock 클래스 는 5 가지 잠 금 형식 을 지원 합 니 다:
파일 잠 금 SWOOLEFILELOCK 읽 기와 쓰기 자물쇠 SWOOLERWLOCK 신 호 량 SWOOLESEM
  • 상호 배척 자물쇠 SWOOLEMUTEX
  • 자 회전 자물쇠 SWOOLESPINLOCK 이 자 물 쇠 를 만 드 는 과정 은 구조 함 수 를 호출 하 는 과정 입 니 다.호출 형식 은 다음 과 같 습 니 다.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 잠 금 에 관 한 더 많은 메커니즘 내용 은 예전 의 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 응원 부탁드립니다!

    좋은 웹페이지 즐겨찾기