创建实时线程的编程实现

创建实时线程的编程实现

1.创建一个普通子线程

下面直接给出一个创建普通子线程的代码。

#include <pthread.h>
int running = 10*000*000;
void son_thread(void *arg)
{
    
    
	do{
    
    
		//...
	}while(running);
	pthread_exit(NULL);
}
int main(int argc, char *argv[])
{
    
    
	pthread_t tid;
	if(pthread_create(&tid, NULL, son_thread, NULL)!=0) {
    
    
		fprintf(stderr, "son thread create fail\n");
		exit(-1);
	}
	do {
    
    
		//...
	}while(running--);
	
	pthread_join(tid, NULL);
	exit(0);
}

核心函数是pthread_create,创建一个子线程。

  1. 该子线程的线程号返回给第一个参数tid;
  2. 新创建的线程从第三个参数son_thread开始运行;
  3. 第一个NULL,是定义线程属性,NULL表示直接采用调用线程的属性;
  4. 第二个NULL,是传给son_thread的参数指针。
  5. 该函数返回到调用线程时,0表示成功;否则返回错误编号。

线程创建时,不能保证新创建的线程还是调用线程会先运行。

调用线程一直阻塞在pthread_join()中,直到子线程调用函数pthread_exit()退出。

编译的时候,需要增加-lpthread选项。

2.创建一个实时线程

创建实时线程,核心是增加定义线程属性

static void set_pthread_attr(pthread_attr_t *attr)
{
    
    
    int policy;
    struct sched_param param;
    pthread_attr_init(attr);
	//特权用户
	if(getuid()!=0) {
    
    
		fprintf(stderr, "realtime thread must be created by root\n");
		exit(-1);
	}
	//调度策略
	pthread_attr_setschedpolicy(attr, SCHED_FIFO);
    pthread_attr_getschedpolicy(attr, &policy);
    if(policy!=SCHED_FIFO) {
    
    
        fprintf(stderr, "warning: set pthread attr policy error\n");
        exit(-1);
    }
	//优先级
    pthread_attr_getschedparam(attr, &param);
    param.sched_priority = 1;   
    pthread_attr_setschedparam(attr, &param);
    pthread_attr_getschedparam(attr, &param);
    if(param.sched_priority != 1) {
    
    
        fprintf(stderr, "warning: set pthread attr param error\n");
        exit(-1);
     }

}

利用上面函数创建线程就可以改写为:

int main(int argc, char *argv[])
{
    
    
	pthread_t tid;
	pthread_attr_t attr;
	set_pthread_attr(&attr);
	if(pthread_create(&tid, &attr, son_thread, NULL)!=0) {
    
    
		fprintf(stderr, "son thread create fail\n");
		exit(-1);
	}
	do {
    
    
		//...
	}while(running--);
	
	pthread_join(tid, NULL);
	pthread_attr_destroy(&attr); 
	exit(0);
}

注意:实时线程需要用特权用户来运行。

3.线程的CPU绑定

调用下面CPU绑定函数的线程,会将自己绑定到目标CPU上运行。

#define __USE_GNU
#include <sched.h>
static int set_cpu_affinity(int cpu)
{
    
    
	cpu_set_t mask;
	if((cpu<0)||((cpu>sysconf(_SC_NPROCESSORS_CONF)-1)) {
    
    
		fprintf(stderr, "warning: wrong cpu id\n");
		return -1;
	}
	CPU_ZERO(&mask);
	CPU_SET(cpu, &mask);
	sched_setaffinity(0, sizeof(mask), &mask);
	return 0;
}

4. 关于实时测试的完整代码

请自行下载

猜你喜欢

转载自blog.csdn.net/lsshao/article/details/111541048