一。

1.单核CPU上多线程还有意义么?还能提高性能么?

答:单核CPU是按CPU时隙分配运行资源的,这样想来,貌似多进程和多线程是一样的,多线程好像没什么意义?这个问题得考虑程序是CPU密集还是IO密集:如果是CPU密集型,因为多线程下还得维护同步等开销,性能可能反而下降;如果是IO操作比较频繁,多线程可以减少阻塞、节省内存等资源,可以提高性能。epoll等异步是不是用于单进程?多核处理器上,原则上一个进程的多个线程可以运行在不同核上,但是操作系统并不保证这一点,也许可以,也许不可以。

2.什么时候需要加锁?

多线程下,如果所有线程只是读同一共享资源,可以不加锁;如果其中某个线程会修改某个共享资源,必须加锁,否则可能引起竞争出错,进一步地,何时会引起竞争?比如我们知道“对某个变量加1”分为“周期1:先将内存的数据移动到寄存器,周期2:对寄存器进行操作,周期3:再把寄存器值写回内存”,如果在这其中的某个周期中,另一个线程对这个变量也进行操作,那么结果就会出错,所以这个时候就需要加锁了。

二。

1.互斥量:

pthread_mutex_t my_mutex;
 pthread_mutex_init(&my_mutex,NULL);
 pthread_mutex_lock(&my_mutex);
 pthread_mutex_unlock(&my_mutex);
 pthread_mutex_destroy(&my_mutex);

2.读写锁:比互斥量稍微灵活点

写模式下加锁,跟互斥量一样;读模式下加锁,所有以读模式对它加锁的线程都可以获得访问权,但是以写模式对它加锁的线程都会被阻塞直到锁被释放。适用于对数据结构的读的次数远大于写的情况。

3.条件变量

eg:

线程的共享资源:

struct msg *work;

pthread_cond_t cond;
pthread_cond_init(&cond,NULL);

线程1:

pthread_mutex_lock(&my_mutex);
while(work==NULL){
pthread_cond_wait(&cond,&my_mutex);
pthread_mutex_unlock(&my_mutex);
}

线程2:

pthread_mutex_lock(&my_mutex);
work=mp;
pthread_mutex_unlock(&my_mutex);
pthread_cond_signal(&cond);
pthread_cond_destroy(&cond);

4.自旋锁

与互斥锁的区别在于,线程在等待互旋锁变为可用的这段时间内,并不是处于休眠阻塞状态,而是处于忙等阻塞状态。也是说,这段时间内CPU不能做其他事情,所以自旋锁只能够被持有一小段时间。

5.屏障

pthread_barrier_t my_barrier;
pthread_barrier_init(&my_barrier,NULL,10);
pthread_barrier_wait(&my_barrier);
pthread_barrier_destroy(&my_barrier);

另外一种屏障就是我们熟悉的pthread_join()函数。