macos - pthread macOS PTHREAD_CANCEL_ASYNCHRONOUS не работает

Я использую следующий код:

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

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

void
clean(void *arg)
{
    printf("thread clean: %ld\n", (unsigned long)arg);
}

void*
thread_template(void *arg)
{
    pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
    pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL);
    pthread_cleanup_push(clean, (void*)pthread_self());
    printf("thread: %ld\n", (unsigned long)pthread_self());
    while ( 1 ) {}
    pthread_cleanup_pop(0);
    pthread_exit((void*)0);
}

int
main(int argc, char const *argv[]) {

    pthread_t tid;
    pthread_create(&tid, NULL, thread_template, NULL);

// waiting for 2 seconds
    sleep(2);

    pthread_cancel(tid);
    pthread_join(tid, NULL);
}

Он отлично работает как на FreeBSD 11, так и на Ubuntu 16, результаты выглядят так:

нить: 1994462320
чистая нить: 1994462320

Но в macOS кажется, что pthread_cancel() не влияет на поток, основной поток блокируется в pthread_join(), функция clean никогда не выполняется (выводилась только первая строка).

Итак, что случилось с pthread в macOS? или что-то не так с моим кодом?

0 ответов

Другие вопросы по тегам