pthread_create()中的attr参数的__schedpolicy成员,表示新线程的调度策略,主要包括SCHED_OTHER(正常、非实时)、SCHED_RR(实时、轮转法)和SCHED_FIFO(实时、先入先出)三种,缺省为SCHED_OTHER,后两种调度策略仅对超级用户有效。运行时可以用过pthread_setschedparam()来改变。
__schedparam成员是一个struct sched_param结构,目前仅有一个sched_priority整型变量表示线程的运行优先级。这个参数仅当调度策略为实时(即SCHED_RR或SCHED_FIFO)时才有效,并可以在运行时通过pthread_setschedparam()函数来改变,缺省为0。
struct sched_param {。
int sched_priority;。
};
struct sched_param param = {.sched_priority = 1};。
gcc特有的给结构体成员初始化赋值的方式,内核中很常见。
等价于
param.sched_priority = 1。
#ifndef THREAD_H_ 。
#define THREAD_H_ 。
#include <unistd.h> 。
#include <pthread.h> 。
class Runnable 。
{
public:
//运行实体
virtual void run() = 0; 。
};
//线程类
class Thread: public Runnable 。
{
private:
//线程初始化号
static int thread_init_number; 。
//当前线程初始化序号
int current_thread_init_number; 。
//线程体
Runnable *target; 。
//当前线程的线程ID
pthread_t tid; 。
//线程的状态
int thread_status; 。
//线程属性
pthread_attr_t attr; 。
//线程优先级
sched_param param; 。
//获取执行方法的指针
static void* run0(void* pVoid); 。
//内部执行方法
void* run1(); 。
//获取线程序号
static int get_next_thread_num(); 。
public:
//线程的状态-新建
static const int THREAD_STATUS_NEW = 0; 。
//线程的状态-正在运行
static const int THREAD_STATUS_RUNNING = 1; 。
//线程的状态-运行结束
static const int THREAD_STATUS_EXIT = -1; 。
//构造函数
Thread();
//构造函数
Thread(Runnable *target); 。
//析构
~Thread();
//线程的运行体
void run();
//开始执行线程
bool start(); 。
//获取线程状态
int get_state(); 。
//等待线程直至退出
void join();
//等待线程退出或者超时
void join(unsigned long millis_time); 。
//比较两个线程时候相同,通过current_thread_init_number判断 。
bool operator ==(const Thread* other_pthread); 。
//获取this线程ID
pthread_t get_thread_id(); 。
//获取当前线程ID
static pthread_t get_current_thread_id(); 。
//当前线程是否和某个线程相等,通过tid判断 。
static bool is_equals(Thread* iTarget); 。
//设置线程的类型:绑定/非绑定 。
void set_thread_scope(bool isSystem); 。
//获取线程的类型:绑定/非绑定 。
bool get_thread_scope(); 。
//设置线程的优先级,1-99,其中99为实时,意外的为普通 。
void set_thread_priority(int priority); 。
//获取线程的优先级
int get_thread_priority(); 。
};
int Thread::thread_init_number = 1; 。
inline int Thread::get_next_thread_num() 。
{
return thread_init_number++; 。
}
void* Thread::run0(void* pVoid) 。
{
Thread* p = (Thread*) pVoid; 。
p->run1(); 。
return p;
}
void* Thread::run1() 。
{
thread_status = THREAD_STATUS_RUNNING; 。
tid = pthread_self(); 。
run();
thread_status = THREAD_STATUS_EXIT; 。
tid = 0;
pthread_exit(NULL); 。
}
void Thread::run() 。
{
if (target != NULL) 。
{
(*target).run(); 。
}
}
Thread::Thread() 。
{
tid = 0;
thread_status = THREAD_STATUS_NEW; 。
current_thread_init_number = get_next_thread_num(); 。
pthread_attr_init(&attr); 。
}
Thread::Thread(Runnable *iTarget) 。
{
target = iTarget; 。
tid = 0;
thread_status = THREAD_STATUS_NEW; 。
current_thread_init_number = get_next_thread_num(); 。
pthread_attr_init(&attr); 。
}
Thread::~Thread() 。
{
pthread_attr_destroy(&attr); 。
}
bool Thread::start() 。
{
return pthread_create(&tid, &attr, run0, this); 。
}
inline pthread_t Thread::get_current_thread_id() 。
{
return pthread_self(); 。
}
inline pthread_t Thread::get_thread_id() 。
{
return tid;
}
inline int Thread::get_state() 。
{
return thread_status; 。
}
void Thread::join() 。
{
if (tid > 0) 。
{
pthread_join(tid,NULL); 。
}
}
void Thread::join(unsigned long millis_time) 。
{
if (tid == 0) 。
{
return;
}
if (millis_time == 0) 。
{
join();
}
else
{
unsigned long k = 0; 。
while (thread_status != THREAD_STATUS_EXIT && k <= millis_time) 。
{
usleep(100); 。
k++;
}
}
}
bool Thread::operator ==(const Thread* other_pthread) 。
{
if(other_pthread==NULL) 。
{
return false; 。
}if(current_thread_init_number==(*other_pthread).current_thread_init_number) 。
{
return true; 。
}
return false; 。
}
bool Thread::is_equals(Thread* iTarget) 。
{
if (iTarget == NULL) 。
{
return false; 。
}
return pthread_self() == iTarget->tid; 。
}
void Thread::set_thread_scope(bool isSystem) 。
{
if (isSystem) 。
{
pthread_attr_setscope(&attr, PTHREAD_SCOPE_SYSTEM); 。
}
else
{
pthread_attr_setscope(&attr, PTHREAD_SCOPE_PROCESS); 。
}
}
void Thread::set_thread_priority(int priority) 。
{
pthread_attr_getschedparam(&attr,¶m); 。
param.__sched_priority = priority; 。
pthread_attr_setschedparam(&attr,¶m); 。
}
int Thread::get_thread_priority(){ 。
pthread_attr_getschedparam(&attr,¶m); 。
return param.__sched_priority; 。
}
#endif /* THREAD_H_ */。
【第一个问题】
argv[i]越界了,不能保证都是null,改成这样。
for(i=1;i<argc;i++)。
demo[i-1]=atoi(argv[i]);。
for(--i;i<3;++i)。
demo[i]=10; 。
【第二个问题】
我的理解是第一个子进程wakeup的瞬间,其他的子进程还是sleep,因此第一个子进程执行了printf。
优先级再高的进程sleep了也抢不过优先级低的活动进程。
因此最好保持3个子进程同时活动。
else//子进程执行代码
sleep(1);//为了父进程顺利启动3个子进程,sleep还是留着吧。
for(i=1;i;i++);//保持活动一段时间。
//报告进程号和优先级。
printf("child %d priority=%d\n",getpid(),getpriority(PRIO_PROCESS,0));。
exit(EXIT_SUCCESS);。
//return EXIT_SUCCESS;。
下面是代码“
pthread_t id;
pthread_create(&id, NULL, t_fun, NULL);。
void *t_fun(void *aa)。
int policy, ret; 。
struct sched_param param; 。
//获取线程调度参数
ret = pthread_getschedparam(pthread_self(), &policy, ¶m);。
if(ret!=0)
{
printf("pthread_getschedparam %s\n", strerror(ret) ); 。
exit(1);
}
if (policy == SCHED_FIFO) 。
{
printf("policy:SCHED_FIFO\n"); 。
}
else if (policy == SCHED_OTHER) 。
{
printf("policy:SCHED_OTHER\n"); 。
}
else if (policy == SCHED_RR) 。
{
printf("policy:SCHED_RR\n"); 。
}
printf("param:%d\n", param.sched_priority); 。
pthread_exit(NULL); 。