线程
进程
进程是程序执行时的一个实例,是担当分配系统资源的基本单位。一个进程在同一时刻只能做一件事情。
进程有独立的空间
进程是线程的容器
线程
线程有自己的堆栈和局部变量,但线程没有单独的地址空间
优点:1.节俭的多任务操作方式 2.方便的通信机制
pthread库支持
基本概念:
线程
创建 pthread_create
#include <pthread.h>
int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine)(void *), void *arg);
退出 pthread_exit
1)线程只是从启动例程中返回,返回值是线程的退出码。
2)线程可以被同一进程中的其他线程取消。
3)线程调用pthread_exit:
#include <pthread.h>
int pthread_exit(void *rval_ptr);
等待 pthread_join
#include <pthread.h>
int pthread_join(pthread_t thread, void **rval_ptr);
// 返回:若成功返回0,否则返回错误编号
其他
线程脱离
#include <pthread.h>
int pthread_detach(pthread_t thread);
// 返回:若成功返回0,否则返回错误编号c
线程ID获取和比较
#include <pthread.h>
pthread_t pthread_self(void);
// 返回:调用线程的ID
#include <pthread.h>
int pthread_equal(pthread_ct tid1, pthread_t tid2);
// 返回:若相等则返回非0值,否则返回0
互斥锁
互斥量(mutex)本质上是一把锁,在访问共享资源前对加锁,在访问完成后释放锁。
创建 pthread_mutex_init
销毁 pthread_mutex_destroy
#include <pthread.h>
int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t *restrict attr);
int pthread_mutex_destroy(pthread_mutex_t *mutex);
// 返回:若成功返回0,否则返回错误编号
加锁 pthread_mutex_lock
解锁 pthread_mutex_unlock
#include <pthread.h>
int pthread_mutex_lock(pthread_mutex_t *mutex);
int pthread_mutex_trylock(pthread_mutex_t *mutex);
int pthread_mutex_unlock(pthread_mutex_t *mutex);
// 返回:若成功返回0,否则返回错误编号
条件
创建 pthread_cond_init
销毁 pthread_cond_destroy
#include <pthread.h>
int pthread_cond_init(pthread_cond_t *restrict cond, const pthread_condattr_t *restrict attr);
int pthread_cond_destroy(pthread_cond_t *cond);
// 返回:若成功返回0,否则返回错误编号
触发 pthread_cond_signal
广播 pthread_cond_broadcast
#include <pthread.h>
int pthread_cond_signal(pthread_cond_t *cond);
int pthread_cond_broadcast(pthread_cond_t *cond);
// 返回:若成功返回0,否则返回错误编号
等待 pthread_cond_wait/ pthread_cond_timedwait
#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, cond struct timespec *restrict timeout);
// 返回:若成功返回0,否则返回错误编号
互斥锁进入死锁怎么办
死锁
互斥锁使用不当,多个线程无法进行下一步代码运行。
有两个及以上锁,当线程A获得锁1想去拿锁 2,但线程B获得了锁2想去拿锁1,就会产生死锁。