GIL在python的獲取和釋放

firefule發表於2021-09-11

GIL在python的獲取和釋放

1、說明

執行緒對GIL的操作本質上就是透過修改locked狀態變數來獲取或釋放GIL。

2、獲取GIL例項

執行緒在其他執行緒已經獲取GIL的時候,需要透過pthread_cond_wait()等待獲取GIL的執行緒釋放GIL。

/*獲取GIL*/
int  PyThread_acquire_lock(PyThread_type_lock lock, int waitflag)
{
    int success;
    pthread_lock *thelock = (pthread_lock *)lock;
    int status, error = 0;
    status = pthread_mutex_lock( &thelock->mut ); /*先獲取mutex, 獲得操作locked變數的許可權*/
    success = thelock->locked == 0;
    if ( !success && waitflag ) { /*已有執行緒上鎖,*/
        while ( thelock->locked ) {
            /*透過pthread_cond_wait等待持有鎖的執行緒釋放鎖*/
            status = pthread_cond_wait(&thelock->lock_released,
                                       &thelock->mut);
        }
        success = 1;
    }
    if (success) thelock->locked = 1; /*當前執行緒上鎖*/
    status = pthread_mutex_unlock( &thelock->mut ); /*解鎖mutex, 讓其他執行緒有機會進入臨界區等待上鎖*/
    if (error) success = 0;
    return success;
}

3、釋放GIL例項

特別注意最後一步, 透過pthread_cond_signal()通知其他等待(pthread_cond_wait())釋放GIL的執行緒,讓這些執行緒可以獲取GIL。

/*釋放GIL*/
void PyThread_release_lock(PyThread_type_lock lock)
{
    pthread_lock *thelock = (pthread_lock *)lock;
    int status, error = 0;
    status = pthread_mutex_lock( &thelock->mut ); /*透過mutex獲取操作locked變數的許可權*/
    thelock->locked = 0; /*實際的釋放GIL的操作, 就是將locked置為0*/
    status = pthread_mutex_unlock( &thelock->mut ); /*解鎖mutex*/
    status = pthread_cond_signal( &thelock->lock_released ); /*這步非常關鍵, 通知其他執行緒當前執行緒已經釋放GIL*/
}

以上就是GIL在python獲取和釋放的方法,希望能對大家有所幫助。更多Python學習指路:

本文教程操作環境:windows7系統、Python 3.9.1,DELL G3電腦。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/1834/viewspace-2830463/,如需轉載,請註明出處,否則將追究法律責任。

相關文章