liunx多线程

来源:互联网 发布:重庆知秋凤凰怎么样 编辑:程序博客网 时间:2024/05/19 06:48

1. 线程和进程的区别:

进程是系统中程序执行和资源分配的基本单位。每个进程有自己的数据段、代码段和堆栈段。

线程通常叫做轻型的进程。线程是在共享内存空间中并发执行的多道执行路径,他们共享一个进程的资源。

线程和进程比起来很小,所以相对来说,线程花费更少的CPU资源

 

 

2.如何来标识一个线程?

   表示进程号的为pid_t类型,表示线程号的是pthread_t类型; pthread_t是一个结构体而不是整型;

   使用pthread_equal确定两个线程号是否相等;

   使用pthread_self函数来获取线程的ID

 

 

 

3.线程是如何创建和退出的?

 

创建线程使用pthread_create函数。在线程创建以后,就开始运行相关的线程函数。

线程退出时使用函数pthread_exit,是线程的主动行为。注意进程退出时使用exit函数,线程中用pthread_exit替代exit

由于一个进程中的多个线程共享数据段,因此通常在线程退出后,退出线程所占用的资源并不会随线程结束而释放。所有需要pthread_join函数来等待线程结束,类似于wait系统调用。

 

 

4. 如何实现单个线程的退出?

   如果一个线程调用了exit, _Exit, 或者_exit,将导致整个进程的终止。要实现单个线程的退出,可以采用如下方式:

(1)     线程可以简单的从start routine返回,返回值就是线程的退出代码。

(2)    线程可以被同一进程中的其它线程终止。

(3)    线程调用pthread_exit

 

 

5.如何使调用线程阻塞等待指定线程的退出,并获得退出线程的返回码?

 调用线程将会被阻塞直到指定的线程终止。如果线程简单的从start routine返回则rval_ptr将包含返回代码。如果线程是被撤销(调用pthread_exit)的,rval_ptr指向的内存地址将被设置为PTHREAD_CANCELED.

   通过调用pthread_join,我们自动的将一个线程变成分离状态,这样就可以实现资源的回收。如果线程已经处于分离状态,调用pthread_join将会失败,并返回EINVAL

   如果我们对于线程的返回值不感兴趣,可以将rval_ptr设置成NULL。 值得注意的是,pthread_create 和 pthread_exit函数的无类型指针可以传递复杂的结构信息,但这个结构所使用的内存在调用者完成后必须仍然有效(分配在堆上或者是静态变量),否则就会出现使用无效的错误。


6.什么是线程的继承性

子线程继承主线程的属性。进程中的所有信息对该进程的所有线程都是共享的:可执行的程序文本,程序的全局内存,堆内存,栈,文件描述符;信号的处理是进程中所有线程共享的。(如果信号的默认处理是中止该进程,那么即使把信号传给某个线程也一样会将进程杀掉)


7.线程退出的方式有哪些

1.线程从执行函数返回,返回值是线程的退出码

2.线程被统一进程的其他线程取消

3.调用pthread_exit()函数退出。

 

8.如何理解互斥锁

本质上讲,互斥量是一把锁,该锁保护一个或者一些资源(内存或者文件句柄等数据),一个线程如果需要访问该资源,必须要获得互斥量并对其加锁,这是如果其他线程想访问该资源也必须要获得该互斥量,但是锁已经加锁,所以这些进程只能阻塞,直到获得该锁的线程解锁,这是阻塞的进程里面有一个线程获得该互斥量并加锁,获准访问该资源,其他的线程继续阻塞,周而复始。

 

9.互斥锁的分类

1.快速性:默认的类型。

2.递归型:若遇到死锁,同一线程循环给互斥量上锁,系统将会知道该上锁行为来自同一线程,那么就会同意线程给该互斥量上锁。

错误检测型:如果该互斥量已经被上锁,那么后续的上锁将会失败而不会阻塞,pthread_mutex_lock()操作将会返回EDEADL