- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试使用 Pthreads 来设置优先级和调度策略。
我修改了一个简单的套接字(可在线下载),带有一个服务器和几个客户端。这些客户端只是向服务器发送一个字符串。
服务器正在为每个连接的客户端创建一个新线程,并为每个新连接设置更高的优先级,这意味着最后一个连接的客户端是具有最高优先级的。我期望的结果是具有最高优先级的线程是打印出来的线程,直到该客户端连接,而其他线程应该等待。
但是,这不是我得到的结果。无论如何,线程都会被执行,即使是优先级较低的线程。我什至尝试了几种配置,例如使用 pthread_join,但在这种情况下,调度程序将等待该线程完成执行,如果调用另一个具有更高优先级的线程(在我的示例中另一个客户端连接),这是错误的,因为它应该将 CPU 释放给这个新创建的线程。
代码如下:
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdio.h>
#include <pthread.h>
#include <sched.h>
#include <sys/time.h>
#define PORTNUMBER 8888
int prioInit = 30; //global variable to initialize priority
struct serverParm
{
int connectionDesc;
};
//function used to increase priority to new threads
void addPrio(int *prio)
{
*prio = *prio + 10;
}
void *serverThread(void *parmPtr)
{
#define PARMPTR ((struct serverParm *) parmPtr)
int recievedMsgLen;
char messageBuf[1025];
struct sched_param Priority_Param; //struct to set priority
int policy=SCHED_FIFO; //kind of policy desired, either SCHED_FIFO or SCHED_RR, otherwise Linux uses SCHED_OTHER
// Server thread code to deal with message processing
printf("DEBUG: connection made, connectionDesc=%d\n",
PARMPTR->connectionDesc);
pthread_t self_id= pthread_self(); // I ask for the tid..
Priority_Param.sched_priority = prioInit; //.. set the priority (the higher the sooner it is executed, min at 1, max at 99)..
addPrio(&prioInit); //..increase the base priority..
if(pthread_setschedparam(self_id, policy, &Priority_Param) != 0) //.. and set the scheduling options.
{
printf("Error Set Sched\n");
perror("");
exit(1);
}
if (PARMPTR->connectionDesc < 0)
{
printf("Accept failed\n");
exit(1);
}
// Receive messages from sender
while ((recievedMsgLen=
read(PARMPTR->connectionDesc,messageBuf,sizeof(messageBuf)-1)) > 0)
{
recievedMsgLen[messageBuf] = '\0';
printf("Message: %s\n",messageBuf);
}
close(PARMPTR->connectionDesc); // Avoid descriptor leaks
free(PARMPTR); // And memory leaks
}
int main ()
{
int listenDesc;
struct sockaddr_in myAddr;
struct serverParm *parmPtr;
int connectionDesc;
pthread_t threadID;
// Create socket from which to read
if ((listenDesc = socket(AF_INET, SOCK_STREAM, 0)) < 0)
{
perror("open error on socket");
exit(1);
}
// Create "name" of socket
myAddr.sin_family = AF_INET;
myAddr.sin_addr.s_addr = INADDR_ANY;
myAddr.sin_port = htons(PORTNUMBER);
if (bind(listenDesc, (struct sockaddr *) &myAddr, sizeof(myAddr)) < 0)
{
perror("bind error");
exit(1);
}
// Start accepting connections
listen(listenDesc,5);
while (1)
{
// Wait for a client connection
connectionDesc = accept(listenDesc, NULL, NULL);
// Create a thread to actually handle this client
parmPtr = (struct serverParm *)malloc(sizeof(struct serverParm));
parmPtr->connectionDesc = connectionDesc;
if (pthread_create(&threadID, NULL, serverThread, (void *)parmPtr)
!= 0)
{
perror("Thread create error");
close(connectionDesc);
close(listenDesc);
exit(1);
}
printf("Parent ready for another connection\n");
}
}
我正在使用 -pthread 选项进行编译并以 root 身份运行,以便设置和更改策略和优先级。我肯定在这里遗漏了一些东西,但我也想知道是否可以真正使用和更改调度选项,以便具有类似于实时的行为。
最佳答案
当必须在两个或多个可运行线程之间做出选择时,调度程序策略和优先级用于确定哪个线程将运行。
如果您的高优先级线程阻塞在 read()
中,那么它就没有资格运行,而可运行的低优先级线程将有机会运行。优先级的意思是,即使所有可用的 CPU 核心都在运行低优先级线程,当数据从网络到达高优先级线程时,低优先级线程将立即被抢占,以便高优先级线程可以跑。
如果您想查看优先级的影响,让一个低优先级线程做大量工作,这样它几乎总是在使用 CPU:您的高优先级线程仍应立即响应网络输入。
(但是如果你这样做,要么对低优先级线程使用非实时优先级,要么确保你打开了一个以高实时优先级运行的 shell,这样低优先级线程就不会'在需要时阻止您的 shell 运行)。
旁注:您的 addPrio()
函数很活泼——它应该在对 *prio
的更改周围锁定一个互斥量。
关于c - Pthread 优先级和调度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32839010/
int x = 1; System.out.println( x++ + x++ * --x ); 上面的代码打印出“5”,但我不明白怎么办?我一直为最后一个 x 取零,然后乘以仍然为 0 的第二个
我现在正在尝试使用 Preference 类 首选项 pfrOfThis = Preferences.userNodeForPackage(this) 出现错误: “类 java.util.prefs
用下面的代码 import sys print "Hello " + sys.argv[1] if len(sys.argv) > 1 else "Joe" + "." 当我运行时 python he
我的网页包含: td { padding-left:10px; } 引用的样式表包含: .rightColumn * {margin: 0; padding: 0;} 我在 rightc
使用 JPA 我有一个关于 CascadeTypes 的问题。 例如: @ManyToMany(fetch=FetchType.LAZY, cascade={CascadeType.PERSIST,
下面的“括号”是怎么写的? val words = List("foo", "bar", "baz") val phrase = "These are upper case: " + words ma
我只是想知道,对于以下代码,编译器是否单独使用关联性/优先级或其他一些逻辑来评估。 int i = 0, k = 0; i = k++; 如果我们根据关联性和优先级进行评估,postfix ++具有比
我设置了一个 Azure FrontDoor 服务,以主/备份类型的方式将流量分配给两个 API 管理服务。就像我希望所有流量都流向我的主要 APIM 服务一样,如果我碰巧关闭该服务(假装中断),那么
这是一个简单的 CSS: /* Smartphones (portrait and landscape) ----------- */ @media only screen and (min-devi
我设置了一个 Azure FrontDoor 服务,以主/备份类型的方式将流量分配给两个 API 管理服务。就像我希望所有流量都流向我的主要 APIM 服务一样,如果我碰巧关闭该服务(假装中断),那么
来自 Programming Perl pg 90,他说: @ary = (1, 3, sort 4, 2); print @ary; 排序右侧的逗号在排序之前求值,而左侧的逗号在排序之
+----+------------+------+ | id | title | lang | +----+------------+------+ | 1 | title 1 EN |
如何使用 Java 获取 DiffServe 代码点 (DSCP) 整数的优先级部分?我预计它涉及位移位,但由于某种原因,我似乎无法获得我期望的值。 最佳答案 假设我理解正确,只需向右执行 3 位逻辑
我有下一个运行良好的 js 函数: $(function () { $(".country").click(function () { var countries = Arra
int a[3]={10,20,30}; int* p = a; cout << *p++ << endl; 根据 wikipedia ,后缀++的优先级高于解引用,*p++应该先运行p++再解引用结
我想在优先读取归档后解决这种类型的表达式 2+3/5*9+3-4 这是我尝试解决该任务的代码我该如何解决这个问题 while ( !inputFile.eof() ) { getline( inp
我正在玩 Rhino 并注意到这种奇怪的行为似乎是运算符优先级: js> {}+{} NaN js> ''+{}+{} [object Object][object Object] js> ''+({
我想遍历文件列表并检查它们是否存在,如果文件不存在则给出错误并退出。我写了下面的代码: FILES=( file1.txt file2.txt file3.txt ) for file in ${FI
我正在执行级联 SELECT: SELECT * FROM x WHERE a = 1 AND b = 2 AND c = 3 => If nothing found, try: SELECT * F
即将参加考试,我正在参加之前的考试。 问题: 当两个或多个样式表规则应用于同一元素时,以下哪种类型的规则将优先? 一个。任何来自浏览器的声明 b.有用户来源的正常声明 C。作者来源正常声明 d.文档级
我是一名优秀的程序员,十分优秀!