[Python] How to kill thread in python which stuck in blocking call

Discussão em 'Python' iniciado por Stack, Julho 4, 2025.

  1. Stack

    Stack Membro Participativo

    I tried to cancel thread with c-function pthread_cancel(). Also I check canceltype and cancelstate: it has default values: PTHREAD_CANCEL_DEFERRED and PTHREAD_CANCEL_ENABLE

    import threading
    import ctypes
    from time import sleep
    import os
    import sys

    libc = ctypes.CDLL("libc.so.6")

    pthread_t = ctypes.c_ulong

    PTHREAD_CANCEL_DEFERRED = 0
    PTHREAD_CANCEL_ASYNCHRONOUS = 1
    canceltype = ctypes.c_int
    pthread_setcanceltype = libc.pthread_setcanceltype
    pthread_setcanceltype.argtypes = [ctypes.c_int, ctypes.POINTER(canceltype)]
    pthread_setcanceltype.restype = ctypes.c_int

    PTHREAD_CANCEL_ENABLE = 0
    PTHREAD_CANCEL_DISABLE = 1
    cancelstate = ctypes.c_int
    pthread_setcancelstate = libc.pthread_setcancelstate
    pthread_setcancelstate.argtypes = [ctypes.c_int, ctypes.POINTER(cancelstate)]
    pthread_setcancelstate.restype = ctypes.c_int

    pthread_cancel = libc.pthread_cancel
    pthread_cancel.argtypes = [pthread_t]
    pthread_cancel.restype = ctypes.c_int

    def terminate_thread(thread):
    if not thread.is_alive():
    return
    #exc = ctypes.py_object(SystemExit)
    #res = ctypes.pythonapi.PyThreadState_SetAsyncExc(ctypes.c_long(thread.ident), exc)
    res = pthread_cancel(thread.ident)
    #if res == 0:
    # raise ValueError("Can't stop thread.")
    if res != 0:
    #ctypes.pythonapi.PyThreadState_SetAsyncExc(thread.ident, None)
    raise SystemError("Error while stopping thread:",res)

    def thread2():
    prev_type = canceltype()
    ret = pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, ctypes.byref(prev_type))
    if ret != 0:
    err = ctypes.get_errno()
    print(f"pthread_setcanceltype failed: errno={err}")
    return
    print('prev_type=',prev_type)

    ret = pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, ctypes.byref(prev_type))
    if ret != 0:
    err = ctypes.get_errno()
    print(f"pthread_setcancelstate failed: errno={err}")
    return
    print('prev_state=',prev_type)

    print("thread2 start reading")
    #input()
    sleep(1000) # for sleep() and for input() it behaves the same
    print("thread2 ends")

    thr2 = threading.Thread(target=thread2)
    thr2.start()

    sleep(2)

    print("killing thr2")
    terminate_thread(thr2)
    thr2.join()
    print("main exit")



    Why this code stuck in thr2.join() with output:

    prev_type= c_int(0)
    prev_state= c_int(0)
    thread2 start reading
    killing thr2


    But this code:

    #include <stdio.h>
    #include <pthread.h>
    #include <unistd.h>

    void * thread2(void *){
    printf("thread2 start reading\n");
    getchar();
    printf("thread2 ends\n");
    }

    int main(){
    printf("PTHREAD_CANCEL_DEFERRED = %d\nPTHREAD_CANCEL_ASYNCHRONOUS = %d\nPTHREAD_CANCEL_ENABLE = %d\nPTHREAD_CANCEL_DISABLE = %d\n",
    PTHREAD_CANCEL_DEFERRED,PTHREAD_CANCEL_ASYNCHRONOUS,PTHREAD_CANCEL_ENABLE,PTHREAD_CANCEL_DISABLE);

    pthread_t thr2;
    pthread_create(&thr2, NULL, thread2, NULL);

    sleep(2);

    printf("killing thr2\n");
    pthread_cancel(thr2);
    pthread_join(thr2, NULL);
    printf("main exit\n");
    }


    normally treat cancellation of thread? With output:

    PTHREAD_CANCEL_DEFERRED = 0
    PTHREAD_CANCEL_ASYNCHRONOUS = 1
    PTHREAD_CANCEL_ENABLE = 0
    PTHREAD_CANCEL_DISABLE = 1
    thread2 start reading
    killing thr2
    main exit


    sleep(), read() - is cancellation points

    Continue reading...

Compartilhe esta Página