0

我正在学习 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);
}  

I don't know why every time I get the same value of 'iscope' regardless what ever scope I set(either PROCESS_SCOPE/SYSTEM_SCOPE).

4

2 回答 2

1
  1. 您不会检查pthread_attr_setscope通话中的错误。放

    if (ret) perror("pthread_attr_setscope");
    

    两个电话后立即,看看它打印什么。(可能是您的操作系统不支持其中一种或其他调度模式。)

  2. 您使用两个不同的范围常量pthread_attr_setscope连续调用两次。pthread_attr_t这不可能是你想要的。

  3. 您需要将pthread_attr_t第二个参数作为第二个参数传递给pthread_create,而不是NULL那里的 ,以使更改的设置完全生效。

  4. 一旦进行了更改,调度策略将应用于刚刚创建的线程,但pthread_attr_getscope在主线程中被调用。PrintHello如果您想了解刚刚创建的线程的策略,请将其移至。

于 2013-07-10T14:48:42.950 回答
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 基本上只是被忽略了

于 2018-11-22T18:32:09.750 回答