【问题标题】:pthread_create not working properly with pthread_attr_setschedparampthread_create 无法与 pthread_attr_setschedparam 一起正常工作
【发布时间】:2013-02-06 00:51:59
【问题描述】:

我是线程编程的新手。所以对于这个看似愚蠢的问题,我深表歉意。

我正在尝试使用 pthread_attr_t 使用 pthread_create() 创建一个 POSIX 线程。我正在尝试设置sched_priority值并将其放入属性中。代码粘贴在下面:

#include <iostream>
#include <cstring>
#include <pthread.h>
using namespace std;

void* log(void* arg)
{

  FILE *fp = fopen("/tmp/log.txt", "w+");
   if (fp != NULL)
   {
     fputs("Logging with Thread", fp);
    }
   else
   {
    cout <<"file pointer not created" << endl;
   }
   return 0;
 }
int main(int argc, char** argv )
{

  pthread_t th;
  pthread_attr_t th_attr;
  int policy;
  struct sched_param thparam;
  memset(&thparam, 0,sizeof(sched_param));
  int retval = pthread_attr_init(&th_attr);
  if (0 != retval)
   {
     cout <<"Attribute initialization failed" << endl;
   }

  thparam.sched_priority = 10;

  int ret1 = pthread_attr_setschedparam(&th_attr, &thparam);
  if (0 == ret1)
  {
   cout <<"pthread_attr_setschedparam PASSED" << endl;
   } 

 int ret = pthread_create(&th, &th_attr, log, NULL);
 if (0 != ret)
  {
   cout <<"thread not created" << endl;      
  }
 else
  {
   cout <<"Thread created" << endl;
  }

  int retval1 = pthread_getschedparam(th, &policy, &thparam);
  if (0 != retval1)
  {
   cout <<"Inside Main::pthread_getschedparam FAILED at start" << endl;
  }
  else
  {
   cout <<"Inside Main::priority: " << thparam.sched_priority << endl;
   cout <<"Inside Main::sched policy: " << policy << endl;
  }
  pthread_join(th, NULL);

  return (0);
 }

每次我运行这个程序时,都会创建线程,但默认优先级(在我的例子中是 15)。因为我已经将优先级设置为 10,所以它应该从 10 优先级开始。我不明白为什么会这样。我打印的所有日志消息都符合预期,似乎没有错误。 谁能指出我在代码中做错了什么?

谢谢!!!!

编辑:

我似乎发现了一件有趣的事情。我无法在线程创建期间设置线程优先级。但是我可以在创建线程后更改线程的优先级。我使用 API pthread_setschedparam 来设置优先级。这次线程的优先级正确地改变了。仍然无法理解为什么会发生这种情况。

我还应该提到我正在使用带有 ARM arch 的嵌入式系统。我还将调度程序策略设置为 SCHED_RR。

有人能解释一下为什么会这样吗?

【问题讨论】:

    标签: c++ linux pthreads


    【解决方案1】:

    您确定看到此输出吗?

    pthread_attr_setschedparam PASSED
    

    您没有检查 pthread_attr_setschedparam 调用是否有错误,我认为它可能返回 EINVAL,因此线程的优先级没有改变。

    Linux 手册页声称该函数总是成功,但当我测试您的代码时,情况并非如此。

    【讨论】:

    • 是的,我的输出中得到了 pthread_attr_setschedparam PASSED。我还检查了错误值“EINVAL == ret1”和“ENOTSUP == ret1”。它不显示任何错误日志。
    • 嗯,奇怪的是它失败了。我看到那个调用失败了,所以想知道这是否是你得到的,并且没有注意到缺少 PASSED 输出,但它一定是别的东西
    • 我已经用我看到的新行为编辑了这个问题。你对此有什么解释吗?
    • 我无法解释,抱歉。您可能想取消勾选我的答案以引起对该问题的更多关注,我怀疑人们更有可能查看它是否还没有答案
    • 感谢您的建议。我会这样做的。
    【解决方案2】:

    试试这样的:

    pthread_attr_init(&thread_attr);
    pthread_attr_setdetachstate(&thread_attr, PTHREAD_CREATE_DETACHED);
    

    【讨论】:

    • 但我想创建具有某些属性的线程。分离线程对我有什么帮助?能否请您更详细一点。
    【解决方案3】:

    来自手册页:

       In order for the parameter setting made by
       pthread_attr_setschedparam() to have effect when calling
       pthread_create(3), the caller must use
       pthread_attr_setinheritsched(3) to set the inherit-scheduler
       attribute of the attributes object attr to PTHREAD_EXPLICIT_SCHED.
    

    【讨论】:

    • 虽然代码很受欢迎,但它应该始终有一个附带的解释。这不必很长,但在意料之中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-14
    • 2020-08-19
    • 2019-02-02
    • 2021-10-15
    • 2016-07-05
    • 2016-09-13
    • 2014-08-23
    相关资源
    最近更新 更多