设计思路
- 线程优先级设置:利用Linux的SCHED_FIFO或SCHED_RR调度策略来设置关键线程的高优先级。SCHED_FIFO适合于那些需要一直运行直到完成的关键任务,而SCHED_RR则适合需要定期调度的关键任务。非关键线程可以使用较低优先级的调度策略,如SCHED_OTHER。
- 资源管理机制:
- 互斥锁(Mutex):用于保护共享资源,确保同一时间只有一个线程可以访问共享资源,防止数据竞争。
- 信号量(Semaphore):用于控制对有限资源的访问数量。例如,对于I/O设备,可以使用信号量来限制同时访问设备的线程数量。
技术细节
- 线程优先级设置:
- 使用
pthread_setschedparam
函数来设置线程的调度参数,包括调度策略和优先级。
- 优先级值的范围是0到
SCHED_RR_MAX
或SCHED_FIFO_MAX
,数值越大优先级越高。
- 互斥锁:
- 使用
pthread_mutex_init
初始化互斥锁。
- 在访问共享资源前使用
pthread_mutex_lock
锁定互斥锁,访问结束后使用pthread_mutex_unlock
解锁。
- 信号量:
- 使用
sem_init
初始化信号量,设置初始值(即允许同时访问的线程数量)。
- 使用
sem_wait
等待信号量,当信号量值大于0时,将其值减1并继续执行;否则线程阻塞。
- 使用
sem_post
释放信号量,将其值加1。
核心代码实现
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <sched.h>
#include <semaphore.h>
// 定义互斥锁
pthread_mutex_t mutex;
// 定义信号量
sem_t sem;
// 共享资源
int shared_resource = 0;
// 关键线程函数
void* critical_thread(void* arg) {
struct sched_param param;
// 设置线程调度策略为SCHED_FIFO
param.sched_priority = sched_get_priority_max(SCHED_FIFO);
if (pthread_setschedparam(pthread_self(), SCHED_FIFO, ¶m) == -1) {
perror("pthread_setschedparam");
return NULL;
}
// 访问共享资源
pthread_mutex_lock(&mutex);
sem_wait(&sem);
shared_resource++;
printf("Critical thread incremented shared resource: %d\n", shared_resource);
sem_post(&sem);
pthread_mutex_unlock(&mutex);
return NULL;
}
// 非关键线程函数
void* non_critical_thread(void* arg) {
struct sched_param param;
// 设置线程调度策略为SCHED_OTHER
param.sched_priority = sched_get_priority_min(SCHED_OTHER);
if (pthread_setschedparam(pthread_self(), SCHED_OTHER, ¶m) == -1) {
perror("pthread_setschedparam");
return NULL;
}
// 访问共享资源
pthread_mutex_lock(&mutex);
sem_wait(&sem);
shared_resource--;
printf("Non - critical thread decremented shared resource: %d\n", shared_resource);
sem_post(&sem);
pthread_mutex_unlock(&mutex);
return NULL;
}
int main() {
pthread_t tid1, tid2;
// 初始化互斥锁
if (pthread_mutex_init(&mutex, NULL) != 0) {
printf("\n mutex init has failed\n");
return 1;
}
// 初始化信号量,允许同时有3个线程访问
if (sem_init(&sem, 0, 3) != 0) {
printf("\n semaphore init has failed\n");
return 1;
}
// 创建关键线程
if (pthread_create(&tid1, NULL, critical_thread, NULL) != 0) {
printf("\n ERROR creating thread 1");
return 1;
}
// 创建非关键线程
if (pthread_create(&tid2, NULL, non_critical_thread, NULL) != 0) {
printf("\n ERROR creating thread 2");
return 1;
}
// 等待线程结束
if (pthread_join(tid1, NULL) != 0) {
printf("\n ERROR joining thread");
return 2;
}
if (pthread_join(tid2, NULL) != 0) {
printf("\n ERROR joining thread");
return 2;
}
// 销毁互斥锁
pthread_mutex_destroy(&mutex);
// 销毁信号量
sem_destroy(&sem);
return 0;
}