qfedu-linux-advanced-level/day6/thread12.c

72 lines
2.0 KiB
C
Raw Permalink Normal View History

2023-08-21 19:45:29 +08:00
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
void clean(void *data)
{
printf("---已清理---\n");
}
void *read_line(void *path)
{
pthread_cleanup_push(clean, NULL); // 注册清理函数
printf("按行读取 %s 数据\n", (char *)path);
sleep(2);
pthread_cleanup_pop(1); // 执行清理函数
}
int main(int argc, char const **argv)
{
if (argc != 3)
{
printf("usage: %s filepath1 filepath2", argv[0]);
return 0;
}
pthread_attr_t attr; // 线程属性
pthread_attr_init(&attr); // 初始化线程属性
// 设置线程分离 (通过属性修改)
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
// 获取当前线程的栈的大小
size_t stackSize;
pthread_attr_getstacksize(&attr, &stackSize);
printf("线程默认的栈大小: %ld Mb\n", stackSize / 1024 / 1024);
stackSize /= 2;
pthread_attr_setstacksize(&attr, stackSize);
pthread_attr_getstacksize(&attr, &stackSize);
printf("修改后栈大小: %ld Mb\n", stackSize / 1024 / 1024);
// 获取当前线程的优先级
struct sched_param param;
pthread_attr_getschedparam(&attr, &param);
printf("默认线程的优先级: %d\n", param.__sched_priority);
pthread_t tid2;
pthread_create(&tid2, &attr, read_line, (void *)argv[2]);
pthread_t tid;
pthread_create(&tid, &attr, read_line, (void *)argv[1]); // 创建线程
param.__sched_priority = 10;
// 设置单个线程的优先级
pthread_setschedparam(tid, SCHED_FIFO, &param);
struct sched_param param2;
param2.__sched_priority = 12;
pthread_setschedparam(tid2, SCHED_FIFO, &param2);
int detachstate;
if (pthread_attr_getdetachstate(&attr, &detachstate) == 0) // 获取线程的分离状态
{
if (detachstate != PTHREAD_CREATE_DETACHED) // 如果线程不是分离状态
{
pthread_join(tid, NULL); // 等待线程结束
}
}
sleep(3);
pthread_attr_destroy(&attr); // 清理线程属性
return 0;
}