我们在4.4.1节提供了一个示例POSIX Pthread程序,并介绍了使用Pthreads创建线程。现在,我们强调POSIX Pthread API,它允许在线程创建期间指定 PCS或SCS。Pthreads标识了如下的竞争范围值:

  • PTHREAD SCOPE PROCESS:使用PCS调度线程。
  • PTHREAD SCOPE SYSTEM:使用SCS调度线程。

在实现多对多模型的系统上,PTHREAD SCOPE PROCESS_策略将用户级线程调度到可用的LWPs上。_LWPs的数量由线程库维护,可能使用调度器激活(参见4.6.5)。PTHREAD SCOPE SYSTEM策略将在多对多系统上为每个用户级线程创建并绑定一个LWP,使用一对一策略有效地映射线程

Pthread IPC提供了两个函数,用于获取和设置争用范围策略:

  • pthread_attr_setscope(pthread attr t *attr, int scope)
  • pthread_attr_getscope(pthread attr t *attr, int *scope)

这两个函数的第一个参数包含指向该线程的属性集的指针。传递给pthread attr setscope()函数的第二个参数是PTHREAD_SCOPE_SYSTEM或PTHREAD_SCOPE_PROCESS值,表明设置的竞争范围的值。对于pthread attr getscope(),第二个参数包含一个指针指向一个int值,该值设置为争用范围的当前值。如果出现错误,每个函数都会返回一个非零值。

在图6.8中,我们演示了一个Pthread调度API。程序首先确定现有的争用范围,并将其设置为PTHREAD_SCOPE_SYSTEM。然后,它将创建5个单独的线程,这些线程将使用SCS调度策略运行。注意,在某些系统中,只允许某些争用范围值。例如,Linux和Mac OS X系统只允许PTHREAD_SCOPE_SYSTEM。

#include < pthread.h >
#include < stdio.h >
#define NUM THREADS 5
int main(int argc, char *argv[])
{
    int i, scope;
    pthread t tid[NUM THREADS];
    pthread attr t attr;
    /* get the default attributes */
    pthread attr init(&attr);
    /* first inquire on the current scope */
    if (pthread attr getscope(&attr, &scope) != 0)
        fprintf(stderr, "Unable to get scheduling scope \ n");
    else {
        if (scope == PTHREAD SCOPE PROCESS)
            printf("PTHREAD SCOPE PROCESS");
        else if (scope == PTHREAD SCOPE SYSTEM)
            printf("PTHREAD SCOPE SYSTEM");
        else
            fprintf(stderr, "Illegal scope value. \ n");
    }
    /* set the scheduling algorithm to PCS or SCS */
    pthread attr setscope(&attr, PTHREAD SCOPE SYSTEM);
    /* create the threads */
    for (i = 0; i < NUM THREADS; i++)
        pthread create(&tid[i],&attr,runner,NULL);
        /* now join on each thread */
    for (i = 0; i < NUM THREADS; i++)
        pthread join(tid[i], NULL);
    }
/* Each thread will begin control in this function */
void *runner(void *param)
{
    /* do some work ... */
    pthread exit(0);
}

图6-8 Pthread调度API

results matching ""

    No results matching ""