我是線程編程的新手。所以我對這個看似愚蠢的問題表示歉意。pthread_create與pthread_attr_setschedparam無法正常工作
我想創建一個POSIX線程使用pthread_create()使用pthread_attr_t。我想設置sched_priority值,並把它在attribute.The代碼粘貼如下:
#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。
有人可以解釋爲什麼會發生這種情況嗎?
是我收到** pthread_attr_setschedparam PASSED **在我的輸出。我還檢查了錯誤值'EINVAL == ret1'和'ENOTSUP == ret1'。它不顯示任何錯誤日誌。 – spanky 2013-02-21 04:17:09
呵呵,那很奇怪,那就失敗了。我看到這個通話失敗,所以想知道這是不是你所得到的,並且沒有注意到PASSED輸出的缺失,但它一定是其他的東西 – 2013-02-21 09:32:37
我已經用我看到的新行爲編輯了這個問題。你有任何解釋。 – spanky 2013-02-21 09:37:20