在主流的操作系统中c 多线程控制控件实例,多任务通常都提供了进程和线程两种推动方法,进程享有独立的进程空间c 多线程控制控件实例,而线程相对于进程来说是一种更加轻量级的多任务并行,多线程之间通常都是共享所在进程的内存空间的。
Linux也不例外,虽然从内核的视角来看,线程表现为一种对进程的"克隆"(clone),共享进程的资源。但是在客户空间提供了线程管理制度来推动对线程的管控,目前Linux中最流行的线程模式为LinuxThreads,下面以一个多线程编程示例来介绍该泛型库的编程接口:
示例1:线程的构建和退出,等待句柄结束和获取线程的返回值
#include
#include
#include
/************************************************************
*线程变量:线程运行执行的变量
*参数p:通用类型的指针,启动线程时释放给线程变量的参数
*返回值:通用类型指针,线程结束后开启线程的变量可以获取该值
*************************************************************/
void* task(void* p){
double r = *(double*)p;
printf("%lf\n",3.14*r*r);
}
void* task2(void* p){
static int sum = 0;
int i;
for(i=1;i
sum = sum+i;
return ∑
//pthread_exit(&sum);线程退出,和return等价
}
int main(){
pthread_t id1,id2;
double d = 1.0;
int* pi = NULL;
/*
*创建线程函数,在主句柄中读取该变量可以构建线程
*参数1:线程ID,ID由平台分配,该参数是一个传出参数,类型为pthread_t *
*参数2:线程属性,使用默认属性给0即可,类型为pthread_attr_t *
*参数3:线程变量,即句柄运行时代码,类型为void *(*)(void *)
*参数4:传递给线程变量的参数
*/
pthread_create(&id1,0,task,&d);//计算圆的面积
pthread_create(&id2,0,task2,0);//计算累加和
/*
*等待句柄结束数组,用于在一个线程中期待另外一个线程结束
*参数1:要期待结束的线程的ID
*参数2:结束线程的返回值的地址(由于是传出参数,所以是返回值的地址)
*/
pthread_join(id1,0);
pthread_join(id2,(void**)&pi);//pi=∑
printf("sum=%d\n",*pi);
return 0;
}
此外,我们还可以修改线程的属性,下面介绍修改线程分离属性的代码
示例2:设置线程的分离属性
#include
#include
//线程函数
void* task(void* p){
int i;
for(i=0;i
printf("%d\n",i);
usleep(100000);//0.1秒
}
}
int main(){
pthread_t id;
pthread_create(&id,0,task,0);
/*
*将线程修改为分离属性,分离属性的线程如果结束,直接回收资源
*因此当线程修改为分离属性后将能够再期待线程结束和获得线程的返回值
*参数:设置分离属性的线程ID
*/
pthread_detach(id);//detach的线程join
//pthread_join(id,0);//无效
int i;
for(i=0;i
printf("main:%d\n",i);
usleep(100000);//0.1秒
}
}
由于多线程之间是共享进程资源的,所以多线程编程时必须对共享资源的访问进行保护
包括互斥和同步,常用的方法比如互斥锁和信号量
示例3:互斥锁的使用
#include
#include
char* data[5];//定义一个长度是5字符串数组
int size = 0;//定义了当前下标,也是人数
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-124222-1.html