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? или что-то не так с моим кодом?