Bootstrap

Linux程序设计-线程 [总结概况版][复习专用][速通]

导航

当前章节:线程
原文链接:线程
目录:Linux程序设计

线程

介绍

线程是进程中的执行单元。它们与父进程共享相同的内存空间和资源。
在操作系统中,进程是资源分配的最小单位,而线程是处理器调度的最小单位,进程内的所有线程的资源是共享的,当进程阻塞时,所有线程都阻塞

线程允许在同一进程中有多个执行路径。他们共享:

  • 代码部分
  • 数据部分(全局变量)
  • 打开文件
  • 信号处理器
  • 当前工作目录
    每个线程都有自己的:
  • 堆栈
  • 寄存器
  • 线程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中,有几种使用互斥和条件变量进行线程同步的主要方法:

  1. 互斥-保护代码的关键部分不被多个线程同时执行。操作包括:
  • pthread_mutex_init()-初始化互斥对象
  • pthread_mutex_lock()-锁定互斥对象
  • pthread_mutex_unlock()-解锁互斥对象
  • pthread_mutex_destroy()-销毁互斥对象
  1. 条件变量-允许线程阻塞,直到满足条件为止。操作包括:
  • pthread_cond_init()-初始化条件变量
  • pthread_cond_wait()-等待条件变量
  • pthread_cond_signal()-发出等待线程的信号
  • pthread_cond_broadcast()-向所有等待的线程发送信号
  • pthread_cond_destroy()-销毁条件变量
  1. 信号量-用于提供线程同步和线程通信的机制。操作包括:
    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()-销毁信号量
  1. 读写锁-允许多个线程同时读取共享资源,但一次只能有一个线程写入该资源。操作包括:
  • pthread_rwlock_init()-初始化读写锁
  • pthread_rwlock_rdlock()-获取读锁
  • pthread_rwlock_wrlock()-获取写锁
  • pthread_rwlock_unlock()-释放锁
  • pthread_rwlock_destroy()-销毁读写锁
  1. Spinlocks-线程在等待获取锁的同时简单地旋转(连续循环)的锁。当锁只持有很短的一段时间时使用。操作包括:
  • pthread_spin_init()-初始化自旋锁
  • pthread_spin_lock()-获取自旋锁
  • pthread_spin_unlock()-释放自旋锁
  • pthread_spin_destroy()-销毁自旋锁

semaphores

semaphore.h提供的信号量方法只支持同一程序下实现多线程或多进程的控制,
不支持子进程、或不相关的进程之间进行通信。

;