linux线程

来源:互联网 发布:淘宝客购买视频教程 编辑:程序博客网 时间:2024/06/03 15:14
===线程===
好处:
1.能够处理异步事件的代码
2.能很方便的共享本进程的资源与数据,无需提供类似复杂的进程间通信机制
3.任务的并行处理
4.改善了响应时间
5.且比多进程开销少很多


2.线程id是一个非负数,但是它的实现可以用一个结构来代表pthread_t数据类型,所以可移植的操作系统实现不能把它作为整数处理,因此比较2个线程id得用:pthread_equal(pthread_t d1, pthread_t d2);
3.pthread_self()获取自身线程id
4.pthread_create(pid, 属性, 线程函数, 参数);
5.每个线程都自己的errno副本
6.linux使用clone系统(子进程)调用来实现pthread_create.其他unix系统都是真正的线程.


线程终止:
1.自己退出,返回值是线程的退出代码
2.被同一进程中其他线程取消
3.线程调用pthread_exit(void *rval)


7.void pthread_exit(void *rval)
8.int pthread_join(pid, void **rval) 一直阻塞知道线程say 88(上面3种情况任意一种):如果线程返回,rval会包含返回码,如果线程被取消,那么rval指定的内存单元就置PTHREAD_CANCELED
  pthread_join自动把线程置于分离状态,这样资源可以恢复(自动释放),如果已经处于分离状态的线程,调用pthread_join会失败,返回EINVAL; 如果对返回值不感兴趣,就rval设置为NULL
9.pthread_cancel(pid);可以取消同一进程里的其他线程,但是线程可以选择忽略或控制取消方式。它仅仅提出请求,并不等待线程终止。


线程清理程序:
1.线程可以安排它退出时需要调用的函数。这与进程调用atexit函数类似。这样的函数成为线程清理处理程序。
2.他们的执行顺序与注册时的顺序相反
 pthread_cleanup_push(void(*rtn)(void*), void *arg);
 pthread_cleanup_pop(int execute);
3.调用时机:
 1.调用pthread_exit()时 : 如果线程return arg;那么不会被调用。因为这属于是正常退出。
 2.响应取消请求时
 3.用非0execute参数调用pthread_cleanup_pop()时
如果execute参数置为0,清理函数将不被调用


4.如果线程已经处于分离状态,线程的底层存储资源可以在线程终止时立即被回收。pthread_detach()调用可以用于使线程进入分离状态。
int pthread_detach(pid);


====线程同步===
1.互斥量(仅仅一个线程)
pthread_mutex_init(互斥量类型,属性) xxx_xxx_destroy(互斥量);
pthread_mutex_lock
pthread_mutex_trylock :可以避免死锁
pthread_mutex_unlock
定义:struct foo{int f_count; pthread_mutex_t f_lock;}; 通常我们把互斥量与它所要保护的数据组织在一起:方便程序的可读性与结构性
2.读写锁:(共享-独占锁:读可以多个线程)
允许更高的并行性:读锁可以多个线程同时加,写锁同样只有一个线程可以加。读写锁有3种状态:读模式枷锁,写模式枷锁,不枷锁:互斥量要么枷锁,要么不加锁,反正一次只能有一个线程。
3.条件变量:(允许等待,防止轮询耗资源)
 可以设置等待超时,


==线程控制==
1.线程属性
2.互斥量属性、读写锁属性、条件变量属性
3.可重入的函数,是线程安全的函数
4.线程私有数据,只初始化一次,然后每个线程都有自己的这个私有数据,
5.线程和信号,每个线程有自己的信号屏蔽字: 
  等待信号、屏蔽信号、发送信号
6.线程调用fork后需要清理线程锁,除非紧接着调用exec函数:清理线程锁:pthread_atfork(xxx)
7.线程与i/o,pread(),pwrite()这样可以使偏移量的设定与数据的读取成为一个原子操作。即lseek() + read()的结合函数。