web服务器----线程

1. 线程与进程

线程是轻量级的进程,是操作系统调度执行的最小单元。进程是系统分配资源的最小单元,父子进程拥有各自的虚拟地址空间,而同一进程下的线程之间共用一个虚拟地址空间,共享堆区以及数据段,因此线程相比进程,消费资源更少,通信更加方便。

2. 线程使用

调用api----pthread_create可以创建子线程,子线程执行程序需要自定义。调用api----pthread_exit可以退出线程。api----pthread_detach实现线程分离,设置分离的线程退出后会自动回收资源。api----pthread_join由主线程回收子线程资源,是阻塞函数。

3. 线程同步

为了防止多个线程同时操作共享资源,需要设置线程同步,某一线程操作共享资源时,其他线程不可以再对其进行操作。对共享资源操作的代码段称为临界区,临界区的代码执行应当是原子操作。

3.1 互斥量

int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t *restrict attr);

int pthread_mutex_destroy(pthread_mutex_t *mutex);

int pthread_mutex_lock(pthread_mutex_t *mutex);

int pthread_mutex_trylock(pthread_mutex_t *mutex);

int pthread_mutex_unlock(pthread_mutex_t *mutex);

互斥量数据类型为pthread_mutex_t,互斥量需要定义为全局变量。调用api----pthread_mutex_lock可以对互斥量加锁,则该线程成为锁的持有者,只有持有者能够解锁。已被锁定的互斥量不能再被加锁。

3.2 条件变量

int pthread_cond_init(pthread_cond_t *restrict cond, const pthread_condattr_t *restrict attr);

int pthread_cond_destroy(pthread_cond_t *cond);

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 abstime);

int pthread_cond_signal(pthread_cond_t *cond);

int pthread_cond_broadcast(pthread_cond_t *cond);

条件变量数据类型为pthread_cond_t,条件变量与互斥量配合使用可以实现生产消费者模型,条件变量主要用于维护队列,获得锁的线程发现资源不足时不能再执行业务逻辑,调用api–pthread_cond_wait,阻塞在原地,并放弃锁的持有权。其他线程创造资源后,再对同一条件变量调用api----pthread_cond_signal或pthread_cond_broadcast,阻塞的线程在有资格重新持有锁时就会解除阻塞,加锁。

3.3 信号量

int sem_init(sem_t *sem, int pshared, unsigned int value);

int sem_destroy(sem_t *sem);

int sem_wait(sem_t *sem);

int sem_trywait(sem_t *sem);

int sem_timedwait(sem_t *sem, const struct timespec *abs_timeout);

int sem_post(sem_t *sem);

int sem_getvalue(sem_t *sem, int *sval);

信号量数据类型为sem_t,信号量其实类似条件变量,也常与互斥量配合使用实现生成消费者模型,但是信号量可以记录状态,可以指明可用资源的数量。线程在准备加锁操作临界区之前,调用api----sem_wait,会对资源数减1,如果资源数本来<=0,则会阻塞在原地,不再继续执行加锁等操作。等其他线程创建资源后,对同一信号量调用api----sem_post,会对资源数加1,阻塞的线程检测到资源可用,则取消阻塞,对资源时减1,继续执行其他程序。

3.4 死锁

死锁产生有很多情况,如:线程加锁后不解锁,想再次加锁时则会发生死锁;线程a持有锁1后需要再获得锁2,线程b持有锁2后需要再获得锁1,两个线程都持有对方继续执行所需的资源,则会发生死锁。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值