pthread创建RR线程

简介:
#define _GNU_SOURCE 

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <sched.h>  
#include <pthread.h>
#include <unistd.h> 
#include <errno.h>
#include <string.h>

typedef void* (*threadfunc)(void *data);
int thread_stop = 0;

void *pt_fn(void * data)
{
    while(!thread_stop)
    {
        printf("pt_fn.\n");
    }
    return ((void *)0)
}

int pcreate_rr_thread(pthread_t *tid, int priority, threadfunc func, void *data)
{
    pthread_attr_t  attr;
    struct sched_param  params;
    int ret = 0;
    pthread_attr_init(&attr);
    //不继承父线程的调度策略
    if((ret = pthread_attr_setinheritsched(&attr,PTHREAD_EXPLICIT_SCHED)))
    {
        printf("pthread_attr_setinheritsched failed.\n");
    }
    //设置子线程为RR调度策略         
    if((ret = pthread_attr_setschedpolicy(&attr,SCHED_RR)))
    {
        printf("pthread_attr_setschedpolicy failed.\n");
    }
    //设置优先级
    params.sched_priority = priority;
    if((ret = pthread_attr_setschedparam(&attr, ¶ms)))
    {
        printf("pthread_attr_setschedparam failed.\n");
    }
    //创建线程
    if((ret = pthread_create(tid, &attr, func, (void *)data)))
    {
        printf("pthread_create failed with error.\n");
    }
    
    return ret;
    
}

int main(void)
{

    char exit;
    pthread_t thread;
    int max_prio;

    max_prio = sched_get_priority_max(SCHED_RR);
    if((ret = pcreate_rr_thread(&thread, max_prio, pt_fn, NULL)))
    {
        printf("pcreate_rr_thread thread failed.\n");
        goto err_pthread_tx;
    }
    while(exit != 'q')
    {
        scanf("%c", &exit);
    }
    thread_stop = 1;   
    pthread_join(thread, NULL);
    printf("exit successed.\n");
    return ret;
err_pthread_tx:
    return ret;    
}


//编译 gcc -o thread thread.c -pthread


目录
相关文章
|
2天前
|
安全 程序员 API
|
3月前
|
存储 安全 Unix
并发编程基础:使用POSIX线程(pthread)进行多线程编程。
并发编程基础:使用POSIX线程(pthread)进行多线程编程。
80 0
Pthread线程使用详解
文中先讲解函数,再运行实例,以及一些注意事项
229 0
|
Linux
Linux系统编程-(pthread)线程通信(自旋锁)
自旋锁不管是内核编程,还是应用层编程都会用到;自旋锁和互斥量类似,它不是通过休眠使进程阻塞,而是在获取锁之前一直处于忙等(也就叫自旋)状态。
417 1
|
监控 Linux
Linux系统编程-(pthread)线程通信(条件变量)
条件变量是线程可用的一种同步机制,条件变量给多个线程提供了一个回合的场所,条件变量和互斥量一起使用,允许线程以无竞争的方式等待特定的条件发生。 条件变量本身是由互斥体保护的,线程在改变条件状态之前必须首先锁住互斥量,其他线程在获取互斥量之前就不会觉察到这种变化,因为互斥量必须锁定之后才改变条件。
187 0
|
Linux
Linux系统编程-(pthread)线程通信(读写锁)
**读写锁与互斥锁类似,读写锁比互斥锁有更高的并行性,读写锁特点如下:** ​ 1. 读写锁有三种状态,读模式下加锁(共享)、写模式下加锁(独占)以及不加锁。 ​ 2. 一次只有一个线程可以占有写模式下的读写锁;但是多个线程可以同时占有读模式下的读写锁。 ​ 3. 读写锁在写加锁状态时,其他试图以写状态加锁的线程都会被阻塞。读写锁在读加锁状态时,如果有线程希望以写模式加锁时,必须阻塞,直到所有线程释放锁。 ​ 4. 当读写锁以读模式加锁时,如果有线程试图以写模式对其加锁,那么读写锁会阻塞随后的读模式锁请求,以避免读锁长期占用,而写锁得不到请求。
224 0
|
Linux API
Linux系统编程-(pthread)线程通信(信号量)
信号量的运用环境与互斥锁一样,但是信号量比互斥锁增加灵活,互斥锁只有两个状态(开锁和解锁),而信号量本质上是一个计数器,它内部有一个变量计数信号值,可以保护一个资源可以同时被1个或者2个或者3个线程同时使用,如果信号量的值只是设置1(状态只有0和1),那么和互斥锁就是一样的功能。
618 0
|
Linux
Linux系统编程-(pthread)线程通信(围栏机制)
Linux线程里还支持一个围栏机制--也就是屏障功能。这个围栏机制,可以设置等待的线程数量,当指定数量的线程都到齐之后再全部唤醒—放行。它的的功能和它的名字是匹配的,就是围栏,就像在赛跑比赛场上,要进行比赛时,必须等待所有运动员都到齐全了,都到起跑线上了,然后一声令下,大家再一起跑出去。
374 0
|
Linux
Linux系统编程-(pthread)线程通信(互斥锁)
这篇文章介绍Linux下线程同步与互斥机制--互斥锁,在多线程并发的时候,都会出现多个消费者取数据的情况,这种时候数据都需要进行保护,比如: 火车票售票系统、汽车票售票系统一样,总票数是固定的,但是购票的终端非常多。
447 0
|
Linux
Linux系统编程-(pthread)线程的使用案例(分离属性、清理函数等)
这篇文章介绍Linux下线程的创建与基本使用案例,主要是案例代码为主;相关的函数详细介绍在上篇文章里已经介绍过了。
209 0