`
sealbird
  • 浏览: 584168 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

2、浅谈pthread_setschedparam的使用

阅读更多
浅谈pthread_setschedparam的使用
int pthread_setschedparam(pthread_t target_thread,  int  policy,  const    struct sched_param *param)在多线程开发中经常被使用的,它主要用于设置线程的调用策略和优先级。在介绍它的使用方法之前,我们先简单的介绍一下它的使用参数。
1. target_thread是使用pthread_create所获得的线程ID。
2.线程的调度有三种策略:SCHED_OTHER、SCHED_RR和SCHED_FIFO。Policy用于指明使用哪种策略。下面我们简单的说明一下这三种调度策略。
SCHED_OTHER它是默认的线程分时调度策略,所有的线程的优先级别都是0,线程的调度是通过分时来完成的。简单地说,如果系统使用这种调度策略,程序将无法设置线程的优先级。请注意,这种调度策略也是抢占式的,当高优先级的线程准备运行的时候,当前线程将被抢占并进入等待队列。这种调度策略仅仅决定线程在可运行线程队列中的具有相同优先级的线程的运行次序。
SCHED_FIFO它是一种实时的先进先出调用策略,且只能在超级用户下运行。这种调用策略仅仅被使用于优先级大于0的线程。它意味着,使用SCHED_FIFO的可运行线程将一直抢占使用SCHED_OTHER的运行线程J。此外SCHED_FIFO是一个非分时的简单调度策略,当一个线程变成可运行状态,它将被追加到对应优先级队列的尾部((POSIX 1003.1)。当所有高优先级的线程终止或者阻塞时,它将被运行。对于相同优先级别的线程,按照简单的先进先运行的规则运行。我们考虑一种很坏的情况,如果有若干相同优先级的线程等待执行,然而最早执行的线程无终止或者阻塞动作,那么其他线程是无法执行的,除非当前线程调用如pthread_yield之类的函数,所以在使用SCHED_FIFO的时候要小心处理相同级别线程的动作。
SCHED_RR鉴于SCHED_FIFO调度策略的一些缺点,SCHED_RR对SCHED_FIFO做出了一些增强功能。从实质上看,它还是SCHED_FIFO调用策略。它使用最大运行时间来限制当前进程的运行,当运行时间大于等于最大运行时间的时候,当前线程将被切换并放置于相同优先级队列的最后。这样做的好处是其他具有相同级别的线程能在“自私“线程下执行。
3.param是struct sched_param类型的指针,它仅仅包含一个成员变sched_priority,指明所要设置的静态线程优先级。

到此为止,读者已经基本了解了这个函数的相关知识点,那么如何正确的使用它呢?我们不妨使用一个简单的例子来说明它吧。

int WYQThread_SetPrority( pthread_t tid, int prority )
{
// Check parameters
assert( tid > 0 );
if ( tid <= 0 )
{
    printf( “Invalid thread’s id(%ld)\n”, (long) tid );
    return EINV;
}
assert(prority >= 0 && prority <= 99 );
if (prority < 0 || prority > 99 )
{
    printf( “Invalid thread’s prority(%ld)\n”, (long) prority );
    return EINV;
}
 
// Set thread’s prority
if ( prority != 0 ) // We use SCHED_FIFO or SCHED_RR
{
    // Check whether user is root
if ( geteuid() == 0 )
{
    struct sched_param sched;
    
    sched.sched_priority = prority;
    
    // We use RR to act as the default scheduler
    return pthread_setschedparam( tid, SCHED_RR, &sched );
}
// We don’t support user mode for static prority’s scheduler, so ignore it
}
 
return 0;
}


上述仅仅是一个简单的例子,主要说明了其中的一些注意点。它有很多改进的地方,比如可以使用虚优先级(在程序中加入虚实影射表)等,我想这些地方就留给大家去完善吧J


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/hello_wyq/archive/2007/04/09/1557707.aspx
分享到:
评论

相关推荐

    pthread_cond_wait() 用法深入分析

    下面是一个简单的示例,展示了如何使用 `pthread_cond_wait()` 和 `pthread_cond_signal()`: ```c #include &lt;pthread.h&gt; #include // 共享资源 static pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER; static...

    pthread_testcancel pthread_kill pthread_cancel

    pthread_testcancel pthread_kill pthread_cancel 的使用例子

    信号pthread_cond_wait

    接下来,我们将详细探讨`pthread_cond_wait`的工作原理、使用方法以及在实际编程中的应用。 一、`pthread_cond_wait`的基本概念 `pthread_cond_wait`函数是线程阻塞和恢复的桥梁,它结合了条件变量(condition ...

    为什么在pthread_cond_wait()前要加一个while循环来判断条件是否为假呢?.Linux 多线程

    2. **条件变量与互斥量**:条件变量(condition variables)通常与互斥量(mutexes)一起使用,用于控制线程对共享资源的访问。线程首先会锁定互斥量,然后检查某个条件是否满足。如果条件不满足,线程会调用`...

    Posix(1).rar_POSIX Pthread_posix_pthread_pthread posix

    5. **线程调度**:可能涵盖了线程的调度策略(SCHED_FIFO, SCHED_RR, SCHED_OTHER)和优先级,以及如何通过`pthread_setschedparam()`进行设置。 6. **线程间通信**:`pthread_cond_broadcast()`、`pthread_cond_...

    编译时报 Looking for pthread_create - not found 的解决办法

    编译时报 Looking for pthread_create - not found 的解决办法 linux gcc 编译时报Looking for pthread_create - not found 其解决办法是...

    pthread-primer.rar_Pthread Primer pdf_pthread_pthread primer

    7. **线程调度**:讨论了POSIX线程的调度策略,如抢占式调度和轮转调度,以及如何通过`pthread_setschedparam()`等函数调整线程优先级。 8. **错误处理**:如何正确处理Pthread函数调用的错误,以及如何使用`errno`...

    pthread_mutex

    2. `pthread_mutex_lock()`: 当线程需要访问共享资源时,调用此函数锁定互斥锁。如果锁已经被其他线程持有,当前线程会被阻塞直到锁被释放。 3. `pthread_mutex_unlock()`: 在完成对共享资源的访问后,线程应调用此...

    线程中处理信号pthread_sigmask 的使用.txt

    线程中处理信号pthread_sigmask 的使用

    [并发并行]_[线程同步]_[pthread_once 实现单例模式分析]

    在这个场景下,我们将深入探讨如何使用 `pthread_once` 在 C/C++ 中实现单例模式,并结合 `Win32` 平台的特性进行讨论。 首先,单例模式是一种设计模式,确保一个类只有一个实例,并提供一个全局访问点。在多线程...

    pthreads_pthread_

    2. `pthread_join()`:等待指定线程结束并回收其资源。这是同步原语,用于避免线程间的竞态条件。 3. `pthread_exit()`:线程执行完毕或遇到错误时,通过此函数退出。可以传递一个退出状态码。 4. `pthread_mutex_...

    线程编程——使用pthread_join(Jack_pthread_join_test.rar)

    线程编程——使用pthread_join。 打包文件包含两个文件:c文件源代码、Makefile文件,运行环境在Ubuntu14.04下,使用自带的gcc编译器,同学们只需将文件夹复制到某一目录下之后在终端执行:1.“make”生成“test”可...

    pthread_self获取当前调用线程的识别码

    2. **同步与互斥**:在实现线程间的同步和互斥时,例如使用 `pthread_mutex_lock` 和 `pthread_mutex_unlock` 进行互斥锁操作,通常需要检查持有锁的线程是否就是当前线程,以避免死锁。 3. **调试**:在调试多线程...

    Windows可使用的pthread库

    2. **线程同步**:pthread库提供了多种同步机制,包括互斥锁(`pthread_mutex_t`)、条件变量(`pthread_cond_t`)、信号量(`pthread_semaphore_t`)和读写锁(`pthread_rwlock_t`)。这些同步原语有助于防止数据...

    test_pthread_kill测试程序_

    可以使用`pthread_join`等待线程结束,或者使用条件变量、互斥锁等同步机制。 6. 错误处理:在测试程序中,应适当地处理可能出现的错误,如线程创建失败、信号发送失败等。 通过这样的测试程序,我们可以深入了解`...

    嵌入式\新——pthread_join_exit_演示.ppt

    2. `pthread_exit` 函数: `pthread_exit` 用于结束当前线程的执行,并返回一个状态值。函数原型为: ```c void pthread_exit(void *retval); ``` - `retval`:线程的退出状态,可以传递给调用 `pthread_join...

    windows 下的pthread 库

    5. **线程调度**:`pthread_setschedparam()`和`pthread_getschedparam()`用于设置和获取线程的调度参数,如调度策略和优先级。 6. **线程ID**:`pthread_self()`函数返回当前线程的ID,`pthread_equal()`函数用于...

    2_pthread_sync.tgz

    在`2_pthread_sync`这个压缩包中,我们可以期待找到使用这些同步机制的实例代码。这些示例可能涵盖了如何创建线程、如何使用上述同步原语以及如何在多线程环境中避免竞态条件等问题。通过分析和运行这些代码,我们...

    Pthread-Primer.rar_pthread_unix primer

    《Pthread Primer》是一本专为Unix环境下的多线程编程设计的指南,它深入浅出地介绍了pthread库,这是Unix系统中广泛使用的线程API。Pthread是POSIX线程(Portable Operating System Interface for Unix)的简称,是...

Global site tag (gtag.js) - Google Analytics