导航
线程
介绍
线程是进程中的执行单元。它们与父进程共享相同的内存空间和资源。
在操作系统中,进程是资源分配的最小单位,而线程是处理器调度的最小单位,进程内的所有线程的资源是共享的,当进程阻塞时,所有线程都阻塞
线程允许在同一进程中有多个执行路径。他们共享:
- 代码部分
- 数据部分(全局变量)
- 打开文件
- 信号处理器
- 当前工作目录
每个线程都有自己的: - 堆栈
- 寄存器
- 线程ID
- 每线程信号掩码
创建线程
int pthread_create(pthread_t *thread, pthread_attr_t *attr,
void *(*start_routine) (void *), void *arg);
- thread是指向新线程ID的指针
- attr是线程属性(可以为NULL)
- start_routine是新线程将运行的函数
- arg是指向传递给线程函数的参数的指针
void *thread_func(void *arg) {
printf(“Thread with argument %d\n”, (int)arg);
}
1 2 3 4 5 6 7 8 9 10 11 | int main() { pthread_t t1, t2; int x = 1; int y = 2; pthread_create(&t1, NULL, thread_func, &x); pthread_create(&t2, NULL, thread_func, &y); pthread_join(t1, NULL); pthread_join(t2, NULL); } |
线程同步
在Linux中,有几种使用互斥和条件变量进行线程同步的主要方法:
- 互斥-保护代码的关键部分不被多个线程同时执行。操作包括:
- pthread_mutex_init()-初始化互斥对象
- pthread_mutex_lock()-锁定互斥对象
- pthread_mutex_unlock()-解锁互斥对象
- pthread_mutex_destroy()-销毁互斥对象
- 条件变量-允许线程阻塞,直到满足条件为止。操作包括:
- pthread_cond_init()-初始化条件变量
- pthread_cond_wait()-等待条件变量
- pthread_cond_signal()-发出等待线程的信号
- pthread_cond_broadcast()-向所有等待的线程发送信号
- pthread_cond_destroy()-销毁条件变量
- 信号量-用于提供线程同步和线程通信的机制。操作包括:
sem_t sem
- int sem_init(sem_t *sem, int pshared, unsigned int value);-初始化信号量
- sem_wait()-减少信号量值,如果达到0则阻塞
- sem_post()-增加信号量值,取消阻塞线程
- sem_getvalue(&sem,&value) 获取sem值
- sem_destroy()-销毁信号量
- 读写锁-允许多个线程同时读取共享资源,但一次只能有一个线程写入该资源。操作包括:
- pthread_rwlock_init()-初始化读写锁
- pthread_rwlock_rdlock()-获取读锁
- pthread_rwlock_wrlock()-获取写锁
- pthread_rwlock_unlock()-释放锁
- pthread_rwlock_destroy()-销毁读写锁
- Spinlocks-线程在等待获取锁的同时简单地旋转(连续循环)的锁。当锁只持有很短的一段时间时使用。操作包括:
- pthread_spin_init()-初始化自旋锁
- pthread_spin_lock()-获取自旋锁
- pthread_spin_unlock()-释放自旋锁
- pthread_spin_destroy()-销毁自旋锁
semaphores
semaphore.h提供的信号量方法只支持同一程序下实现多线程或多进程的控制,
不支持子进程、或不相关的进程之间进行通信。