我们在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