线程
- 线程
线程是程序中的一条执行序列(执行单元),一个进程至少有一个线程(主线程),一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。 - 线程与进程的异同点
1)线程与进程都可以并发执行;
2)线程是进程调度的最小执行单位;进程时资源分配的最小单位;
3)在切换时,线程比进程消耗少,效率高; 线程的创建以及退出函数(phread.h)
(创建函数)int pthread_create(pthread_t id,pthread_attr_t *attr,void(pthread_fun)(void*),void*arg);
进程id一般由系统自动分配;attr为进程属性;pthread_fun为函数线程;arg为函数线程的参数(可以传值也可以传地址)1>传值时,强转为(void*),对arg再强转为其相应的变量类型;2>传地址时,对地址强转为(void*),对arg在强转为变量类型的指针,在取值;若传的是地址,获取变量值时要注意,变量值是否被改变;
(退出函数)void pthread_exit(void * reval);
(等待线程结束的函数)int pthread_join(pthread_t id,void**p);阻塞等待指定进程的退出以及获取指定进程由pthread_exit的退出信息;举例
创建两个线程:线程1打印100以内所有素数;线程2对数组进行选择排序,对主线程进行睡眠等待或者pthread_join等待线程1、2结束;
int ar[]={22,55,99,11,66,33,88,44,77};
void *pthread_fun2(void *arg)
{
printf("函数线程2开始运行:对数组进行选择排序并打印::\n");
int i=0;
int n=sizeof(ar)/sizeof(ar[0]);
for(;i<n-1;++i)
{
int k=i;
int j=i+1;
for(;j<n;++j)
{
if(ar[k]>ar[j])k=j;
}
if(i!=j)
{
int tmp=ar[i];ar[i]=ar[k];ar[k]=tmp;
}
}
for(i=0;i<n;++i)printf("%d ",ar[i]);
printf("函数进程2结束\n");
}
void *pthread_fun1(void *arg)
{
printf("函数线程1开始运行:开始打印100以内所欲素数::\n");
int i=2;
for(;i<100;++i)
{
int j=2;
for(j=2;j<=i/2;++j)
{
if(i%j==0)break;
}
if(j>i/2)printf("%d ",i);
}
printf("函数进程1结束\n");
pthread_exit("fun1 over");
}
void main()
{
printf("主函数开始::\n");
pthread_t id1;
pthread_t id2;
int res=pthread_create(&id1,NULL,pthread_fun1,NULL);
assert(res==0);
int res2=pthread_create(&id2,NULL,pthread_fun2,NULL);
assert(res2==0);
// sleep(10);//如果主函数可能先结束,则用pthread_exit(NULL);
char *p=NULL;
pthread_join(id1,(void**)&p);//等待进程1结束,并获取结束信息
pthread_join(id2,NULL);//等待线程2结束
printf("%s\n",p);//打印获取到的进程1的结束信息;
printf("主函数结束\n");
}
运行结果: