- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在主线程中创建了两个线程ThreadA和ThreadB,并且三个线程具有相同的优先级。调用顺序是ThreadA在ThreadB前面(我看不懂)。
但是,当增加主线程优先级时,调用顺序是ThreadB在ThreadA之前(我的理解)。我从手册页收到此消息,如下所示:
调用 sched_setscheduler(2)、sched_setparam(2) 或 sched_setattr(2)
将把 pid 标识的 SCHED_FIFO(或 SCHED_RR)线程放在
列表的开头(如果它是可运行的)。结果,它可能会抢先
当前正在运行的线程(如果具有相同的优先级)。 (POSIX.1
指定线程应该转到列表的末尾。)
代码如下:
/*
* critical.c
*
* compile with gcc critical.c -o critical -lrt -lpthread
*
* result is aaaaabbbbb when three thread have same priority
* result is bbbbbaaaaa when main thread has higher priority
*/
#include <pthread.h> /* header file for pthreads */
#include <unistd.h> /* header file for POSIX conformance */
#include <time.h> /* header file for POSIX time management */
#include <sched.h> /* header file for POSIX scheduling */
#include <stdio.h> /* header file for standard input/outputlibrary */
#define _REENTRANT /* macro to ensure system calls are reentrant */
void *threadA(void *); /* predefine threadA routine */
void *threadB(void *); /* predefine threadB routine */
pthread_t threadA_id,threadB_id,main_id; /* thread identifiers */
pthread_attr_t attrA,attrB; /* thread attribute structures */
struct sched_param param; /* scheduling structure for thread attributes */
int policy=SCHED_FIFO;
int priority_min,priority_max; /* for range of priority levels */
/* main routine */
int main()
{
struct timespec start;
int status; /* check that system calls return ok */
clock_gettime(CLOCK_REALTIME, &start); /* get the time */
printf("Start time is: %d seconds %d nano_seconds\n",start.tv_sec,start.tv_nsec);
/* Set processor affinity */
unsigned long mask = 1; /* use only 1 CPU core */
unsigned int len = sizeof(mask);
status = sched_setaffinity(0, len, &mask);
if (status < 0) perror("sched_setaffinity");
status = sched_getaffinity(0, len, &mask);
if (status < 0) perror("sched_getaffinity");
/* Find priority limits */
priority_max = sched_get_priority_max(policy);
priority_min = sched_get_priority_min(policy);
/* Change priority and policy of main thread */
main_id = pthread_self();
param.sched_priority=priority_min;
status = pthread_setschedparam(main_id, policy, ¶m);
if (status != 0) perror("pthread_setschedparam"); /* error check */
/* Create threadA */
param.sched_priority = priority_min;
pthread_attr_init(&attrA);
status = pthread_attr_setschedpolicy(&attrA,policy);
if (status != 0) perror("pthread_attr_setschedpolicy"); /* error check */
status = pthread_attr_setschedparam(&attrA,¶m);
if (status != 0) perror("pthread_attr_setschedparam"); /* error check */
status = pthread_create(&threadA_id, &attrA, threadA, NULL);
if (status != 0) perror("pthread_create"); /* error check */
status = pthread_setschedparam(threadA_id,policy,¶m);
if (status != 0) perror("pthread_setschedparam");
/* Create threadB */
param.sched_priority = priority_min; /* so that B runs with a higher priority than A */
pthread_attr_init(&attrB);
status = pthread_attr_setschedpolicy(&attrB,policy);
if (status != 0) perror("pthread_attr_setschedpolicy"); /* error check */
status = pthread_attr_setschedparam(&attrB,¶m);
if (status != 0) perror("pthread_attr_setschedparam"); /* error check */
status = pthread_create(&threadB_id, &attrB, threadB, NULL);
if (status != 0) perror("pthread_create"); /* error check */
status = pthread_setschedparam(threadB_id,policy,¶m);
if (status != 0) perror("pthread_setschedparam");
/* Join threads - force main to wait for the thread to terminate */
printf("main() waiting for threads\n");
status = pthread_join(threadA_id, NULL);
if (status != 0) perror("pthread_join(threadA_id, NULL)"); /* error check */
status = pthread_join(threadB_id, NULL);
if (status != 0) perror("pthread_join(threadB_id, NULL)"); /* error check */
printf("\nmain() reporting that all threads have terminated\n");
return(0);
} /* end of main */
void *threadA(void *arg)
{
int j;
for(j=1;j<=5;j++){
printf("a");
}
return (NULL);
}
void *threadB(void *arg)
{
int j;
for(j=1;j<=5;j++){
printf("b");
}
return (NULL);
}
最佳答案
示例是创建一个优先级为 1、采用 FIFO 调度的线程:
int retVal;
pthread_attr_t attr;
struct sched_param schedParam;
pthread_t thread;
retVal = pthread_attr_init(&attr);
if (retVal)
{
fprintf(stderr, "pthread_attr_init error %d\n", retVal);
exit(1);
}
retVal = pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED);
if (retVal)
{
fprintf(stderr, "pthread_attr_setinheritsched error %d\n", retVal);
exit(1);
}
retVal = pthread_attr_setschedpolicy(&attr, SCHED_FIFO);
if (retVal)
{
fprintf(stderr, "pthread_attr_setschedpolicy error %d\n", retVal);
exit(1);
}
schedParam.sched_priority = 1;
retVal = pthread_attr_setschedparam(&attr, &schedParam);
if (retVal)
{
fprintf(stderr, "pthread_attr_setschedparam error %d\n", retVal);
exit(1);
}
retVal = pthread_create(&thread,
&attr,
_Thread,
NULL);
if (retVal)
{
fprintf(stderr, "pthread_create error %d\n", retVal);
exit(1);
}
如果您的实时优先级软限制过于严格。
在运行代码之前,在 shell 中调用 ulimit -r unlimited
。或者直接在代码中调用 setrlimit(RLIMIT_RTPRIO, ...)
。
系统范围的限制在/etc/security/limits.conf
中设置。
关于当线程具有相同优先级时,对 SCHED_FIFO 策略的 theads 调度感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42967909/
我有一个程序可以打开一个窗口并快速改变背景颜色并随机弹出矩形和椭圆形。我的代码有效,但我不知道为什么,因为我没有在我的代码中调用 repaint() 函数。当我使用我个人的 update() 函数包含
var allRapidSpells = $$('input[value^=RSW]'); 谁能告诉我这是做什么的? 最佳答案 我敢猜测您正在使用 MooTools ,一个 JavaScript 框架
我有一个抽象父类,它有多个子类。我希望 child 能够拥有一个对于该 child 的每个实例都相同的变量。我不想将构造函数传递给 child 来告诉它它的名字,因为当它可以被硬编码时,这看起来很愚蠢
我刚刚在 Git 存储库上做了一些糟糕的事情,我不知道如何解决这个问题。我什至不知道我是怎么把它弄成这样的……! 在存储库(托管在 git hub 上)上,有 3 个我感兴趣的分支:master、br
我是 GIT 的新手,在理解提交日志图时遇到问题。 我感觉每条平行线都是一个分支。虽然我的源代码只有 2 个分支。我在下面提供的提交日志图中看到 3-4 条平行线(Microsoft Team Ser
我是 WPF 的新手,ScrollViewer 让我很沮丧。要么我只是没有“得到”它,要么它是一种有限的控制。 这是我的挫折: 水平滚动错误 水平滚动条仅在列表底部可见(我必须滚动到底部才能看到) 坏
那么 $('table.selectable td.capable input:text') 比 $('table.selectable td input:text') 更好吗?换句话说,指定一个类会
我刚刚完成了计算机图形学类(class),我们必须对光线追踪器进行编程。尽管所有结果都是正确的,但我对 OpenMP 的使用感到困惑(顺便说一句,这不是类(class)的一部分)。我有这个循环(C++
与 PatternSynonyms ( explicitly bidirectional form ),pattern-to-expr 方程实际上形成了一个函数,但拼写为大写(假设您最终得到正确类型的
我是 javascript/coffeescript 新手。 有人可以解释一下为什么这个 CoffeeScript/JavaScript 会毫无延迟地快速通过吗?我对第一种情况的想法是,它是对 upd
如果我调用document.getElementsByClassName('cl'),我会得到一个 HTMLCollection。它似乎包含 Element 对象而不是 HTMLElement 对象,
这是我本月的 azure payasyougo 使用费用。 我很难理解为什么我要为标准中型应用服务付费,我认为它会包含在计算时间中?我只运行一个云服务,这对于一个没有做太多事情的云服务来说似乎有点陡峭
除了the issue I am already having之外,我还在I saw a video on it之后安装了HBase(尚未安装)之前,还安装了Zookeeper。在安装它时,我遇到了许
我正在将 XSLT 与 regexp:match exslt 函数一起使用。上述函数采用 JavaScript Regex 模式。因此,我尝试匹配一组数字 1 到 3 OR 5 到 7 OR 9 到
我想知道为什么这段代码会给出消息:SyntaxError:意外的标记其他。 var compare = function(choice1,choice2){ if(choice1===choice2)
我尝试使用复选框和 JQuery 过滤日历上的事件, $(document).ready(function () { $('.scrollable-menu :checkbox').click(f
假设我们有一个用户想要一个名为:“test/lasdhjal.txt”,无论如何。现在,如果我将其放入新的文件(输入)中;对象里面,它会认为 test/是一个文件夹,而它是名称的一部分。我能做什么呢?
问题是 stash 的更改不会留在我 stash 它们的分支中。其他分支存储将被覆盖示例: 我愿意: git checkout iss4 // made some changes gi
我是一个 java 新手,并且在 StackOverflow 错误/在类之间访问文件的能力方面遇到了一个非常令人困惑的问题。我知道根本原因可能是我进行了一些递归调用,但修复它的语法却让我无法理解。我认
public X createData(int n) { int[] values = new int[n]; Random rand = new Random(); for
我是一名优秀的程序员,十分优秀!