APUE学习笔记(第十一章:线程)

  • 1、每个线程在进行事件处理时可以采用同步编程模式,同步编程要比异步编程模式简单得多。

  • 2、有人把多线程的程序设计与多处理器或多核系统联系起来。但是即使程序运行在单处理器上,也能得到多线程编程的模型的好处。

  • 3、处理器的数量并不影响程序结构,所以不管处理器的个数多少,程序都可以通过使用线程得以简化。多线程程序在单处理器上运行还可以改善响应时间和吞吐量。

  • 4、进程ID在系统中是惟一的,但是线程ID不同,线程ID只有在它所属的进程上下文中才有意义。

  • 5、pthread_equal对两个线程ID比较,相等返回非0,否则返回0。

  • 6、Pthread_self(void)获取自身的线程ID。

  • 7、线程退出方法:线程可以被统一进程中的其他线程取消;线程调用pthread_exit;线程可以简单地从启动例程中返回,线程返回退出码。

  • 8、线程可以通过调用pthread_cancel函数来请求取消同一进程中的其他进程。pthread_cancel并不等待线程终止,它仅仅提出请求,线程可以选择忽略取消或者控制如何被取消。

  • 9、pthread_detach分离线程。

  • 10、线程同步:当一个线程可以修改的变量,其他线程可以读取或者修改的时候,我们就需要对这些线程进行同步,确保他们在访问变量的存储内容时不会访问到无效的值。为了解决这个问题,线程不得不使用锁,同一时间只允许一个线程访问该变量。

  • 11、互斥量从本质上说是一把锁,在访问共享资源前对互斥量进行设置(加锁),在访问完成后释放(解锁)互斥量。互斥变量使用pthread_mutex_t数据类型表示的。在使用之前,必须对它进行初始化,如果动态分配互斥量,在释放内存前需要调用pthread_mutex_destroy。

  • 12、互斥量的功能:可以使用pthread_mutex_lock对互斥量进行加锁,如果互斥量已经上锁,调用线程将阻塞直到互斥量被解锁。可以使用pthread_mutex_unlock对互斥量解锁。如果不希望被阻塞,可以使用pthread_mutex_trylock尝试对互斥量进行加锁。如果互斥量处于未锁住状态,则锁住互斥量,否则返回EBUSY。

  • 13、避免死锁:如果线程试图对同一个互斥量加锁两次,那么它自身就会陷入死锁状态。如果两个线程以相反的顺序锁住两个互斥量,也会导致死锁,两个线程都无法向前运行。在同时需要两个互斥量时,让他们以相同的顺序加锁,这样可以避免死锁。

  • 14、函数pthread_mutex_timedlock:与pthread_mutex_lock不同的是,pthread_mutex_timedlock允许绑定线程阻塞时间,如果超过时间值,pthread_mutex_timedlock不会对互斥量进行加锁,而是返回错误码ETIMEDOUT。

  • 15、读写锁:

#include <pthread.h>
int pthread_rwlock_init(pthread_rwlock_t *restrict rwlock,
                        const pthread_rwlockattr_t *restrict attr);
int pthread_rwlock_destroy(pthread_rwlock_t *rwlock);
  • 16、带有超时的读写锁:
#include <pthread.h>
#include <time.h>
int pthread_rwlock_timedrdlock(pthread_rwlock_t *restrict rwlock,
                               const struct timespec *restrict tsptr);
int pthread_rwlock_timedwrlock(pthread_rwlock_t *restrict rwlock,
                               const struct timespec *restrict tsptr);
  • 17、条件变量:在使用条件变量之前,必须对它进行初始化,在释放底层的内存空间之前,可以使用pthread_cond_destory函数对条件变量进行反初始化。

  • 18、条件本身是由互斥量保护的。线程在改变条件状态之前必须先锁住互斥量,然后调用下面函数等待条件变为真。

#include <pthread.h>
int pthread_cond_wait(pthread_cond_t *restrict cond,pthread_mutex_t *restrict mutex);
int pthread_cond_timedwait(pthread_cond_t *restrict cond,
              pthread_mutex_t *restrict mutex,const struct timespec *restrict tsptr);

调用者把锁住的互斥量传给函数,函数自动把调用线程放到等待条件的线程列表上,对互斥量解锁。

  • 19、自旋锁:

自旋锁与互斥量类似,但它不是通过休眠使进程阻塞,而是在获取锁之前一直处于忙等(自旋)阻塞状态。

自旋锁可用于以下情况:锁被持有的时间短,而且线程并不希望在重新调度上花费太多的成本。

自旋锁的接口与互斥量的接口类似,提供了以下的5个函数。

  • 20、屏障:

屏障是用户协调多个线程并行工作的同步机制。

屏障允许每个线程等待,直到有的合作线程到达某一点,然后从该点继续执行。pthread_join函数就是一种屏障,允许一个线程等待,直到另一个线程退出。

可以使用下面函数对屏障进行初始化跟反初始化

发布了150 篇原创文章 · 获赞 261 · 访问量 30万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 黑客帝国 设计师: 上身试试

分享到微信朋友圈

×

扫一扫,手机浏览