多线程浅谈

来源:互联网 发布:淘宝送到国外吗 编辑:程序博客网 时间:2024/06/06 16:32
什么是线程?
线程是"进程"中某个单一顺序的控制流。也被称为轻量进程(lightweight processes)。
为什么使用线程呢?
顾名思义,轻量级进程。一个线程资源的消耗远远低于一个进程,两者相比大概在30倍(不同系统,有差距滴)。更大的优势,线程切换所需时间远低于进程切换。
多线程编程
要使用多线程编程么?用pthread(POSIX thread)吧,可移植性好,简单可依赖。
怎么用?加一个pthread.h的头文件,链接一个静态库libpthread.a
常用函数?百度百科之

线程锁
互斥锁、读写锁、自旋锁
1.常用的当然是互斥锁(pthread_mutex_t)咯,以下几种:
普通锁: 同一线程可重复加锁,解锁一次搞定,等待锁的线程形成队列,先到先得
嵌套锁: 同一线程可重复加锁,解锁同样次数才可释放锁,先等待锁的进程先获得锁
检查锁: 同一线程不能重复加锁,加上的锁只能由本线程解锁,先等待锁的进程先获得锁
自适应锁 :同一线程可重复加锁,解锁一次搞定,所有等待锁的线程自由竞争
2. 读写锁(pthread_rwrock_t),也用的蛮多的,某些场景,很有用的
3. 自旋锁(pthread_spinlock_t),自旋锁不会引起调用者睡眠,如果自旋锁已经被别的执行单元保持,调用者就一直循环在那里看是否该自旋锁的保持者已经释放了锁。自旋锁通过持续占用CPU避免线程上下文切换的开销。

条件变量
在某些场合,用起来很high的一个东西
它允许线程阻塞从而等待另一个线程某些条件的方法的弥补了互斥锁的不足
简单的说:互斥锁只有YES/NO两种状态,而条件变量可以表达多种状态
需要注意的是,条件变量只是起到阻塞和唤醒线程的作用,具体的判断条件,还要自己给出。
eg:
 pthread_mutex_lock (&count_lock);
 while(count==0)
  pthread_cond_wait( &count_nonzero, &count_lock);
 pthread_mutex_unlock (&count_lock);
原创粉丝点击