创建实时线程的编程实现
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,创建一个子线程。
- 该子线程的线程号返回给第一个参数tid;
- 新创建的线程从第三个参数son_thread开始运行;
- 第一个NULL,是定义线程属性,NULL表示直接采用调用线程的属性;
- 第二个NULL,是传给son_thread的参数指针。
- 该函数返回到调用线程时,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, ¶m);
param.sched_priority = 1;
pthread_attr_setschedparam(attr, ¶m);
pthread_attr_getschedparam(attr, ¶m);
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. 关于实时测试的完整代码
请自行下载