我正在学习pthreads,我想设置一个线程的范围,所以为了设置范围,我使用了pthread_attr_setscope()API但是当我尝试使用pthread_attr_getscope()API获取线程的范围时,无论如何我都会返回0我设置的范围(PROCESS_SCOPE / SYSTEM_SCOPE)。有关更多信息,请在下面找到代码。
#include <pthread.h>
#include <stdio.h>
#include <unistd.h>
#define NUM_THREADS 5
void *PrintHello(void *threadid)
{
long tid;
tid = (long)threadid;
printf("Hello World! It's me, thread #%ld!\n", tid);
pthread_exit(NULL);
}
int main (int argc, char *argv[])
{
pthread_t threads[NUM_THREADS];
pthread_attr_t attr;
int rc;
long t;
int ret=0;
int mypolicy=-1;
int iscope=-1;
ret = pthread_attr_init (&attr);
pthread_attr_setschedpolicy(&attr,SCHED_RR);
// BOUND behavior - Creating SYSTEM_SCOPE thread
ret = pthread_attr_setscope(&attr, PTHREAD_SCOPE_SYSTEM);
//Unbound behaviour - Creating process scope thread
ret = pthread_attr_setscope(&attr,PTHREAD_SCOPE_PROCESS);
for(t=0; t<NUM_THREADS; t++){
printf("In main: creating thread %ld\n", t);
rc = pthread_create(&threads[t], NULL, PrintHello, (void *)t);
printf("Return code from pthread_create() is %d\n", rc);
printf("Return value of getschedule policy = %d \n",pthread_attr_getschedpolicy(&attr, &mypolicy));
printf("policy = %d \n",mypolicy);
printf("Return value of getscope = %d \n",pthread_attr_getscope(&attr,&iscope));
printf("scope = %d \n",iscope);
if (rc){
printf("ERROR; return code from pthread_create() is %d\n", rc);
_exit(-1);
}
}
pthread_exit(NULL);
}
我不知道为什么每次我得到'iscope'的相同值,无论我设置的范围是什么(PROCESS_SCOPE / SYSTEM_SCOPE)。
答案 0 :(得分:1)
您无法检查pthread_attr_setscope
来电中的错误。放
if (ret) perror("pthread_attr_setscope");
两次调用后立即,看看它打印的是什么。 (可能是您的操作系统不支持一种或另一种调度模式。)
您使用两个不同的范围常量在同一pthread_attr_setscope
上连续两次调用pthread_attr_t
。这可能不是你想要的。
您需要将pthread_attr_t
作为第二个参数传递给pthread_create
,而不是将NULL
传递给pthread_attr_getscope
,以使更改的设置完全有效。
进行更改后,调度策略将应用于刚刚创建的线程,但在主线程中调用PrintHello
。如果您想知道刚刚创建的主题的策略,请将其移至{{1}}。
答案 1 :(得分:0)
您从未使用过ret变量,因此gcc编译器对此有所抱怨(我使用-Wall)。
选择一个作用域-如zwol所述,已依次设置两次。
但是,您不需要在线程本身中使用pthread_attr_getscope。 pthread_attr_getscope函数仅报告有关属性中设置的内容。
使用pthread_attr_setinheritsched(&attr,PTHREAD_EXPLICIT_SCHED); -在支持多个争用范围的系统上,需要进行此调用才能获取pthread_create以遵守调度程序属性。否则,新线程将仅继承主线程的作用域。
如果您使用的是Linux,则Linux仅支持PTHREAD_SCOPE_SYSTEM,因此基本上忽略设置PTHREAD_SCOPE_PROCESS的尝试