69 lines
1.5 KiB
C
69 lines
1.5 KiB
C
|
#include <stdio.h>
|
|||
|
#include <pthread.h>
|
|||
|
#include <unistd.h>
|
|||
|
#include <stdlib.h>
|
|||
|
#include <string.h>
|
|||
|
|
|||
|
int global_data;
|
|||
|
void clean(void *data) // 清理函数的耗时属于调用线程
|
|||
|
{
|
|||
|
printf("开始清理数据: %p\n", data);
|
|||
|
global_data = *((int *)data);
|
|||
|
free(data);
|
|||
|
}
|
|||
|
|
|||
|
void *task(void *data)
|
|||
|
{
|
|||
|
int n = atoi((char *)data);
|
|||
|
int *total = malloc(4);
|
|||
|
pthread_cleanup_push(clean, total);
|
|||
|
for (int i = 1; i <= n; i++)
|
|||
|
{
|
|||
|
*total += i;
|
|||
|
usleep(200 * 1000);
|
|||
|
}
|
|||
|
pthread_cleanup_pop(1);
|
|||
|
pthread_exit(NULL); // 加入清理函数后,但数据的退出无意义
|
|||
|
}
|
|||
|
|
|||
|
typedef struct delay_cancel_info
|
|||
|
{
|
|||
|
pthread_t tid;
|
|||
|
int delay;
|
|||
|
} DELAY_INFO;
|
|||
|
|
|||
|
void *delay_cancel(void *data)
|
|||
|
{
|
|||
|
DELAY_INFO *info = (DELAY_INFO *)data;
|
|||
|
sleep(info->delay);
|
|||
|
printf("%ld 线程即将取消\n", info->tid);
|
|||
|
pthread_cancel(info->tid);
|
|||
|
}
|
|||
|
|
|||
|
int main(int argc, char const *argv[])
|
|||
|
{
|
|||
|
if (argc != 3)
|
|||
|
{
|
|||
|
printf("usage: %s number delay_time\n", argv[0]);
|
|||
|
return 0;
|
|||
|
}
|
|||
|
|
|||
|
pthread_t tid;
|
|||
|
pthread_create(&tid, NULL, task, (void *)argv[1]);
|
|||
|
|
|||
|
DELAY_INFO info = {tid, atoi(argv[2])};
|
|||
|
pthread_t tid2;
|
|||
|
pthread_create(&tid2, NULL, delay_cancel, &info);
|
|||
|
|
|||
|
if (pthread_join(tid, NULL) == 0)
|
|||
|
{
|
|||
|
printf("%ld 子线程返回数据: %d\n", tid, global_data);
|
|||
|
}
|
|||
|
|
|||
|
return 0;
|
|||
|
}
|
|||
|
|
|||
|
/*
|
|||
|
【小结】在线程加入的清理函数时,原线程中的pthread_exit()则不能正常返回数据。因此,在清理函数内,将当前堆的数据赋值给全局变量,在主线程中进行使用。
|
|||
|
*/
|