标签:个人 转化 printf oid span div 不能 star 好的
POSIX线程调度是一个混合模型,既支持用户级也支持内核级的线程。在创建线程时对contentionscope属性可设置为:
在一定程度上类似于进程,只是创建、调度的开销要比进程小。有人做过一个实验,创建线程和进程所花时间开销之比为1:10。内核级线程创建代码如下:pthread_attr_t attr;pthread_attr_init(&attr);// 设置内核级的线程,以获取较高的响应速度pthread_attr_setscope(&attr, PTHREAD_SCOPE_SYSTEM);//创建线程ret = pthread_create(&iAcceptThreadId, &attr,AcceptThread, NULL);
优点
缺点:
用户级线程创建代码如下:pthread_attr_t attr;pthread_attr_init(&attr);// 设置用户级的线程pthread_attr_setscope(&attr, PTHREAD_SCOPE_PROCESS);//创建线程ret = pthread_create(&iAcceptThreadId, &attr,AcceptThread, NULL); 但目前LinuxThreads仅实现了PTHREAD_SCOPE_SYSTEM,即,Linux仅提供了内核级线程。运行下列程序,可观察运行结果。程序创建了4个用户级线程(0-3)和4个人内核级线程(4-8),但从运行结果来看,每个线程运行的时间大致相等。如果Linux实现了用户级线程,线程(0-3)执行需要更多的时间。可见在Linux中没有实现用户级线程。
#include <stdio.h> #include <stdlib.h> #include <pthread.h> #include <unistd.h> #include <time.h> int n; //共享变量,对共享变量应互斥使用,为简化设计, // 本程序不考虑互斥问题。(省略互斥机制), void *fun(void *id) { int i, j, sum=0, num=0; time_t t; time(&t); printf("T%s:Start...\n",(char*)id); for (i=0; i<100 ; i++ ) { for(j=0; j<10000000; j++) { sum += 1; } } n++; printf("T%s, time:%ld\n",(char *)id, time(NULL)-t); } char tid[8][2]; int main(void) { pthread_t t[8]; int i; pthread_attr_t attr; pthread_attr_init(&attr); // 设置用户级线程。 pthread_attr_setscope(&attr,PTHREAD_SCOPE_PROCESS); for (i=0; i < 4; i++) { tid[i][0] = 48+i; pthread_create(&t[i], &attr, fun, &tid[i]); } // 设置内核级的线程,以获取较高的响应速度 pthread_attr_setscope(&attr,PTHREAD_SCOPE_SYSTEM); for (i=4; i < 8; i++) { tid[i][0] = 48+i; pthread_create(&t[i], &attr, fun,tid[i]); } while(n!=8); return 0; }
gcc test2.c -o test2 -lpthread
执行结果:
xianchen$ ./test2 T1:Start... T5:Start... T2:Start... T7:Start... T0:Start... T4:Start... T6:Start... T3:Start... T2, time:2 T5, time:3 T6, time:3 T3, time:3 T4, time:3 T7, time:3 T1, time:3 T0, time:3 T0, time:3
标签:个人 转化 printf oid span div 不能 star 好的
原文地址:https://www.cnblogs.com/vx-cg248805770/p/11653265.html