#include <pthread.h>
#include <stdio.h>
#define MAXTHREADS 3
void *myclear(void *x){
printf("clear:%d\n",*((int*)x));
}
void *mycompprint(void *xx){//参数必须为void *,然后进行强制类型转换
int oldstate,oldtype;
pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,&oldstate);//设置线程是可以中止的。
pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED,&oldtype);//设置线程推迟中止,PTHREAD_CANCEL_DEFERRED为默认值。
int *x=(int *)(xx);
void *xxx=(void *)x;
pthread_cleanup_push(myclear,xxx);//压入线程清理堆栈,堆栈包含指向取消过程中执行例程的指针,即中止前执行一个清理。myclear为例程名,x为传给例程的参数
for (int i=1;i<*x;i++){
if ((i%60)==0) {//如果i为250的倍数则取消
printf("%dprint:%d\n",*x,i);
pthread_testcancel();//pthread_testcancel()检测是否需要取消,设置取消点,如果有挂起的取消请求,则在此处中止本线程
}
}
pthread_cleanup_pop(0); //从调用线程清理堆栈的顶部移走清理函数指针,但并不执行它,pthread_testcancel()检测不到取消请求,表示目前不需要取消,所以移走它。pthread_cleanup_pop(1)移走并执行它,即使并没有中止线程;
}
void *mycompadd(void *xx){//参数必须为void *,然后进行强制类型转换
int oldstate,oldtype;
int sum=0;
int *x=(int *)(xx);
int y;
pthread_attr_t attr1;
pthread_setcancelstate(PTHREAD_CANCEL_DISABLE,&oldstate);//设置线程不能中止的。
for (int i=1;i<=*x;i++){
sum+=i;
printf("%dadd%d\n",i,sum);
}
}
void *mycompchen(void *xx){//参数必须为void *,然后进行强制类型转换
int oldstate,oldtype;
size_t size;
void *addr;
int priority;
pthread_attr_t attr1;
struct sched_param param;
pthread_setcancelstate(PTHREAD_CANCEL_DISABLE,&oldstate);//设置线程不能中止的。
pthread_getattr_np(pthread_self(),&attr1);//获取线程属性。
pthread_attr_getstack(&attr1,&addr,&size);//线程属性,地址,大小
param.sched_priority=sched_get_priority_min(SCHED_RR);//SCHED_RR策略的sched_get_priority_min最小优先值
pthread_setschedparam(pthread_self(),SCHED_RR,¶m);//动态设置调度策略
//pthread_setschedprio(pthread_self(),sched_get_priority_min(SCHED_RR)); //另一种动态设置调度优先级的方法
printf("size:%d\n",size); //输出线程堆栈大小
int sum=1;
int *x=(int *)(xx);
for (int i=1;i<=*x;i++){
sum*=i;
printf("%dchen%d\n",i,sum);
}
}
int main(){
//线程分离后,不能再合并
//main为boss线程,
pthread_t threads[MAXTHREADS];//创建线程池
void *status;
pthread_attr_t attr;
//创建worker线程,并执行线程
int n1=25;
int n2=10000;
int priority;
struct sched_param param;
//静态设置线程threads[1]调度及相关属性,优先值越小,优先级越高
pthread_attr_init(&attr);
priority=sched_get_priority_max(SCHED_RR);//SCHED_RR策略的sched_get_priority_max最大优先值
//SCHED_RR轮询调度,SCHED_FIFO先进先出,执行线程直到完成,SCHED_OTHER其他调度。sched_get_prority_max、sched_get_prority_min取得调度策略的最大优先值、最小优先值
param.sched_priority=priority;//设置param的优先级成员
pthread_attr_setschedparam(&attr,¶m);//通过param设置优先级
//深未来技术原创,http://deepfuture.iteye.com
pthread_attr_setinheritsched(&attr,PTHREAD_EXPLICIT_SCHED);//PTHREAD_EXPLICIT_SCHED设置调度属性为属性对象的调度属性,THREAD_INHERIT_EXPLICIT_SCHED为继承调度属性
pthread_create(&(threads[0]),NULL,mycompprint,&n2);
pthread_create(&(threads[1]),&attr,mycompadd,&n1);
pthread_create(&(threads[2]),NULL,mycompchen,&n1); \
for (int i=0;i<MAXTHREADS;i++){
pthread_cancel(threads[i]);
}
sleep(1);
for (int i=0;i<MAXTHREADS;i++){
pthread_join(threads[i],&status); //wait worker线程,并合并到BOSS线程来
if (status==PTHREAD_CANCELED){
printf("thread%d 已经取消!\n",i);
}
else{
printf("thread%d 不能被取消!\n",i);
}
}
return(0);
}
深未来技术原创,http://deepfuture.iteye.com