#线程相对于进程的优点:
线程的创建和上下文切换比进程的创建和上下文切换更快。
线程间交换数据时无需特殊技术。
#线程和进程的差异:
多进程>每个进程的内存空间都由保存全局变量的“数据区”、malloc等函数动态分配提供空间的堆(Heap)、函数运行时使用到的栈(Stack)构成。每个进程都具有这种独立空间。
多线程>多个线程将共享数据区和堆。
#多个线程同时调用函数时(执行时)可能产生问题。这类函数内部存在临界区(多个线程同时执行这部分代码时,可能引起问题)
根据临界区是否引起问题,函数分为两类:线程安全函数,非线程安全函数。
线程安全函数的名称后缀一般为_r
多个线程访问同一变量会产生问题,一个线程访问变量时应该阻止其他线程访问。这就是同步。
临界区:临界区并非变量本身,而是访问变量和计算过程的语句。这些语句可能由多个线程同时运行,这也是引起问题的直接原因。
#线程同步
同步的情况从两方面考虑:
同时访问同一内存空间时发生的情况
需要指定访问同一内存空间的线程执行顺序的情况
互斥量:
互斥量的创建及销毁函数
#include<pthread.h>
int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *attr);
int pthread_mutex_destroy(pthread_mutex_t *mutex);
·mutex 创建和销毁互斥量时传递保存互斥量的变量地址值
·attr 传递即将创建的互斥量属性,没有特别需要指定的属性时传递NULL
→成功时返回0,失败返回其他值
利用互斥量锁住或释放临界区时使用的函数
int pthread_mutex_lock(pthread_mutex_t *mutex);
//临界区的开始
//...........
//临界区的结束
int pthread_mutex_unlock(pthread_mutex_t *mutex);
→成功时返回0,失败返回其他值
死锁:线程退出临界区时,如果没有调用pthread_mutex_unlock函数,其他为了进入临界区而调用
pthread_mutex_lock的线程就无法摆脱阻塞状态。这种情况就是死锁(Dead-lock)
信号量: