Linux多线程学习 - sched_yield() CPU让权
FROM: https://blog.csdn.net/xiaoyeyopulei/article/details/7965533
sched_yield()这个函数可以使 另一个级别等于或高于当前线程的线程先运行。如果没有符合条件的线程,那么这个函数将会立刻返回然后继续执行当前线程的程序。
在成功完成之后返回零,否则返回-1.
NAME
sched_yield - yield the processor
SYNOPSIS
#include <sched.h>int sched_yield(void);
DESCRIPTION
sched_yield() causes the calling thread to relinquish the CPU. The thread is moved to the end of the queue for its static pri‐ority and a new thread gets to run.
RETURN VALUE
On success, sched_yield() returns 0. On error, -1 is returned, anderrno is set appropriately.
ERRORS
In the Linux implementation, sched_yield() always succeeds.
CONFORMING TO
POSIX.1-2001.
看下面一个实例
#define _MULTI_THREADED
#include <pthread.h>
#include <stdio.h>
#include <errno.h>#define LOOPCONSTANT 1000
#define THREADS 3pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
int i, j, k, l;
static void checkResults ( char *string, int rc )
{if ( rc ){printf ( "Error on : %s, rc=%d",string, rc );exit ( EXIT_FAILURE );}return;
}
void *threadfunc ( void *parm )
{int loop = 0;int localProcessingCompleted = 0;int numberOfLocalProcessingBursts = 0;int processingCompletedThisBurst = 0;int rc;printf ( "Entered secondary thread\n" );for ( loop = 0; loop < LOOPCONSTANT; ++loop ){rc = pthread_mutex_lock ( &mutex );checkResults ( "pthread_mutex_lock()\n", rc );/* Perform some not so important processing */i++, j++, k++, l++;rc = pthread_mutex_unlock ( &mutex );checkResults ( "pthread_mutex_unlock()\n", rc );/* This work is not too important. Also, we just released a lock and would like to ensure that other threads get a chance in a more co-operative manner. This is an admittedly contrived example with no real purpose for doing the sched_yield(). */ sched_yield();}printf ( "Finished secondary thread\n" );return NULL;
}
int main ( int argc, char **argv )
{pthread_t threadid[THREADS];int rc = 0;int loop = 0;printf ( "Enter Testcase - %s\n", argv[0] );rc = pthread_mutex_lock ( &mutex );checkResults ( "pthread_mutex_lock()\n", rc );printf ( "Creating %d threads\n", THREADS );for ( loop = 0; loop < THREADS; ++loop ){rc = pthread_create ( &threadid[loop], NULL, threadfunc, NULL );checkResults ( "pthread_create()\n", rc );}sleep ( 1 );rc = pthread_mutex_unlock ( &mutex );checkResults ( "pthread_mutex_unlock()\n", rc );printf ( "Wait for results\n" );for ( loop = 0; loop < THREADS; ++loop ){rc = pthread_join ( threadid[loop], NULL );checkResults ( "pthread_join()\n", rc );}pthread_mutex_destroy ( &mutex );printf ( "Main completed\n" );return 0;
}
编译
gcc - o sched_yield - lphread sched_yield.c
运行结果
Enter Testcase - ./sched_yield
Creating 3 threads
Entered secondary thread
Entered secondary thread
Entered secondary thread
Wait for results
Finished secondary thread
Finished secondary thread
Finished secondary thread
Main completed
Linux多线程学习 - sched_yield() CPU让权相关推荐
- Linux多线程学习(七)sched_yield
sched_yield()这个函数可以使用另一个级别等于或高于当前线程的线程先运行.如果没有符合条件的线程,那么这个函数将会立刻返回然后继续执行当前线程的程序. 在成功完成之后返回零,否则返回-1. ...
- linux多线程学习(七)——实现“生产者和消费者”
在上一篇文章中,利用信号量实现了线程间的互斥,这一篇将要利用信号量的互斥同步机制来实现一个经典实例,就是"生产者和消费者". 1.简单描述生产者和消费者的问题. 有一个缓冲区和两个 ...
- linux多线程学习(六)——信号量实现同步
在上一篇文章中已经用信号量来实现线程间的互斥,达到了互斥锁的效果,今天这篇文章将讲述怎样用信号量去实现同步. 信号量的互斥同步都是通过PV原语来操作的,我们可以通过注册两个信号量,让它们在互斥的问题上 ...
- linux多线程学习(三)——线程属性设置
在上一篇文章中,介绍了线程的创建和退出,以及相关函数的使用.其中pthread_create函数的第二个参数,是关于线程属性的设置,这也是今天所有讲述的.这些属性主要包括邦定属性.分离属性.堆栈地址. ...
- linux多线程学习(二)——线程的创建和退出
在上一篇文章中对线程进行了简单的概述,它在系统中和编程的应用中,扮演的角色是不言而喻的.学习它.掌握它.吃透它是作为一个程序员的必须作为.在接下来的讲述中,所有线程的操作都是用户级的操作.在LINUX ...
- Linux驱动学习记录 cpu主频
以imx6ull芯片为例 imx6ull芯片主频是792MHz 查看cpu信息 cat /proc/cpuinfo proc/cpuinfo processor : 0 model name : AR ...
- linux多线程学习(五)——信号量线程控制
在上一篇文章中,讲述了线程中互斥锁的使用,达到对共享资源互斥使用.除了使用互斥锁,信号量,也就是操作系统中所提到的PV原语,能达到互斥和同步的效果,这就是今天我们所要讲述的信号量线程控制. PV原语是 ...
- linux多线程学习(一)
进程是系统中程序执行和资源分配的基本单位.每个进程都有自己的数据段,代码段和堆栈段,这就导致了进程在进行切换等操作起到了现场保护作用.但是为了进一步减少处理机的空转时间支持多处理器和减少上下文切换开销 ...
- linux多线程学习设置线程调度权限
pthread_setschedparam 设置线程的权限 int pthread_setschedparam(pthread_t target_thread, int policy, const s ...
最新文章
- Castle IOC容器实践之EnterpriseLibrary Configuration Facility
- leetcode 之Remove Nth Node From End of List(19)
- 【TW短评测】6999元Find X2 Pro一周体验:这块120Hz屏我能玩一年
- Oracle 语句连接字符,oracle拼接字符串当sql语句
- mongodb3.4 安装及用户名密码设置
- java 获取 正在执行的方法名
- python 小例子 取文件夹文件 去除后缀
- 三角函数公式大全(速查手册)
- JDK 8 foreach的用法
- IE6下position:fixed;兼容
- 计算机出现全部英文如何解决,电脑开机蓝屏出现一堆英文怎么解决,教你一招三分钟解决...
- HackTheBox - Unified
- C语言 printf() 函数,总结笔记记录
- Chrome 70 将继续在地址栏隐藏网址中的 WWW
- Minecraft 1.12.2模组开发(三十九) 反应器(TileEntity方块实体)
- 医院计算机招聘笔试内容是什么,医院招聘考试的“内幕”难道你不想知道吗?...
- Java-正则表达式:匹配特定字符开头,数字结尾的任一字符串
- Oracle 创建PDB的几种常用方法
- 这群程序员中的「广告狂人」,把抖音广告做成了AR游戏
- 胶囊网络的理解:动态路由与聚类