pthread_kill в многопоточном приложении вызывает ошибку сегментации - PullRequest
0 голосов
/ 31 мая 2019

Мне удалось найти несколько ссылок на эту проблему, которые предположили, что pthread_kill разыменовывает структуру pthread_t, которая вызывала некоторую проблему, однако в других статьях говорилось, что это не проблема, если структура pthread_t создается с помощью pthread_create.

Затем я нашел многопоточный пример того, как сделать это правильно:

Как отправить сигнал процессу в C?

Однако я до сих порполучение ошибок сегмента, вот мой пример кода:

static pthread_t GPUthread;

static void GPUsigHandler(int signo)
{
    fprintf(stderr, "Queue waking\n");
}

void StartGPUQueue()
{
    sigset_t sigmask;                 
    pthread_attr_t attr_obj;             /* a thread attribute variable */
    struct sigaction action;

    /* set up signal mask to block all in main thread */
    sigfillset(&sigmask);                /* to turn on all bits */
    pthread_sigmask(SIG_BLOCK, &sigmask, (sigset_t *)0);

    /* set up signal handlers for SIGINT & SIGUSR1 */
    action.sa_flags = 0;
    action.sa_handler = GPUsigHandler;
    sigaction(SIGUSR1, &action, (struct sigaction *)0);

    pthread_attr_init(&attr_obj);        /* init it to default */
    pthread_attr_setdetachstate(&attr_obj, PTHREAD_CREATE_DETACHED);

    GPUthread = pthread_create(&GPUthread, &attr_obj, ProcessGPUqueue, NULL);

    if (GPUthread != 0) 
    {
        fprintf(stderr, "Cannot start GPU thread\n");
    }
}

void ProcessGPUqueue(void *ptr)
{
    int sigdummy;
    sigset_t sigmask;

    sigfillset(&sigmask);                /* will unblock all signals */  
    pthread_sigmask(SIG_UNBLOCK, &sigmask, (sigset_t *)0);

    fprintf(stderr, "GPU queue alive\n");

    while(queueActive)
    {
        fprintf(stderr, "Processing GPU queue\n");
        while(GPUqueue != NULL)
        {
          // process stuff
        }

        sigwait(&sigmask, &sigdummy);
    }
}


void QueueGPUrequest(unsigned char cmd, unsigned short p1, unsigned short p2, unsigned short p3, unsigned short p4)
{
    // Add request to queue logic ...

    fprintf(stderr, "About to Wake GPU queue\n");
    pthread_kill(GPUthread, SIGUSR1);// Earth shattering KA-BOOM!!!
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...