1.Linux线程概念
什么是线程
线程的缺点
1.性能损失
一个很少被外部事件阻塞的计算密集型线程往往无法与共它线程共享同一个处理器。如果计算密集
型线程的数量比可用的处理器多,那么可能会有较大的性能损失,这里的性能损失指的是增加了额
外的同步和调度开销,而可用的资源不变。
2.健壮性降低
编写多线程需要更全面更深入的考虑,在一个多线程程序里,因时间分配上的细微偏差或者因共享
了不该共享的变量而造成不良影响的可能性是很大的,换句话说线程之间是缺乏保护的。
3.缺乏访问控制
进程是访问控制的基本粒度,在一个线程中调用某些OS函数会对整个进程造成影响
4.编程难度提高
编写与调试一个多线程程序比单线程程序困难得多
线程异常
线程用途
2. Linux线程和进程的区别
创建线程
int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *
(start_routine)(void), void *arg);
参数
thread:返回线程ID
attr:设置线程的属性,attr为NULL表示使用默认属性
start_routine:是个函数地址,线程启动后要执行的函数
arg:传给线程启动函数的参数
返回值:成功返回0;失败返回错误码
线程终止
如果需要只终止某个线程而不终止整个进程,可以有三种方法
pthread_exit函数
功能:线程终止
原型
void pthread_exit(void *value_ptr);
参数
value_ptr:value_ptr不要指向一个局部变量。
返回值:无返回值,跟进程一样,线程结束的时候无法返回到它的调用者(自身)
需要注意,pthread_exit或者return返回的指针所指向的内存单元必须是全局的或者是用malloc分配的,不能在线程函数的栈上分配,因为当其它线程得到这个返回指针时线程函数已经退出了。
pthread_cancel函数
功能:取消一个执行中的线程
原型
int pthread_cancel(pthread_t thread);
参数
thread:线程ID
返回值:成功返回0;失败返回错误码
线程等待
为什么需要线程等待?
功能:等待线程结束
原型
int pthread_join(pthread_t thread, void **value_ptr);
参数
thread:线程ID
value_ptr:它指向一个指针,后者指向线程的返回值
返回值:成功返回0;失败返回错误码
线程分离
int pthread_detach(pthread_t thread);
可以是线程组内其他线程对目标线程进行分离,也可以是线程自己分离
pthread_detach(pthread_self());
joinable和分离是冲突的,一个线程不能既是joinable又是分离的。
#include
#include
#include
#include
#include
void *rout(void *arg)
{
int i;
for(i=1;i<10;++i)
{
printf("This is a pthread\n");
sleep(1);
}
}
int main()
{
pthread_t tid,tid1,tid2;
pthread_create(&tid,NULL,rout,NULL);//线程创建
pthread_create(&tid1,NULL,rout,NULL);
pthread_create(&tid2,NULL,rout,NULL);
pthread_exit(tid);//线程终止
pthread_cancel(tid1);
pthread_cancel(tid2);
pthread_detach(tid);//线程分离
pthread_detach(tid1);
pthread_detach(tid2);
pthread_join(tid,NULL); //线程等待
pthread_join(tid1,NULL);
pthread_join(tid2,NULL);
return 0;
}