一、线程概念
线程:有独立pcb,没有独立空间
进程:有pcb,有独立空间
查看线程
ps -Lf 进程号
lwp线程号
二、线程函数
gcc后要加-pthread
2.1线程id
与线程号不同,id用来标示进程内线程,号用来cpu分配资源
pthread_t pthread_self(void);
2.2 创建线程
int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine)(void *), void *arg);
/*
thread 传出参数,传出创建的线程
attr 线程属性
routine 线程执行函数
arg 函数参数
*/
案例
void *tfn(void *args){
int i=(int)args;
printf("son thread %d pid=%d, tid=%lu",i,getpid(),pthread_self());
return NULL;
}
int main(){
pthread_t pid;
for(int i=0;i<5;i++)
pthread_create(&pid,NULL,tfn,(void*)i);
}
2.3 退出线程
exit是退出进程
void pthread_exit(void *re);
2.4 阻塞并回收线程
xxx * ptr;
int pthread_join(pthread_t thread, void **ptr);
//ptr是一个传出参数,即要回收的线程执行函数的返回值
pthread_join(tid,(void**)&ptr);
2.5 直接杀死线程
pthread_testcancel();
//为函数添加取消点,不添加将无法取消
int pthread_cancel(pthread_t thread);
2.6 线程分离
将该线程分离,不能由其他线程释放,等结束时系统自动释放
int pthread_detach(pthread_t thread);
2.7 错误检查
strerror(int errorno)
perror为检查进程中
三、线程同步
通过锁机制来实现,当前学习均为建议锁,不强制访问锁,可以直接访问数据
3.1 互斥锁
初始为1,上锁--为0,解锁释放为1
pthread_mutex_t lock;
// 创建锁
int pthread_mutex_init(pthread_mutex_t *mutex,const pthread_mutexattr_t *attr);
// 初始化锁
int pthread_mutex_lock(pthread_mutex_t *mutex);
// 加锁
int pthread_mutex_unlock;
// 解锁
int pthread_mutex_destroy(pthread_mutex_t *mutex);
// 销毁锁
pthread_mutex_trylock;// 尝试锁
3.2 读写锁
- 适合读多写少的情况
- 写独占读共享
- 写优先级高
- 读时不允许写
pthread_rwlock_t rwlock;
int pthread_rwlock_init(pthread_rwlock_t *lock, const pthread_rwlockattr_t *attr);
int pthread_rwlock_rdlock(pthread_rwlock_t *lock);
int pthread_rwlock_wrlock(pthread_rwlock_t *lock);
int pthread_rwlock_trywrlock(pthread_rwlock_t *lock);
int pthread_rwlock_tryrdlock(pthread_rwlock_t *lock);
int pthread_rwlock_destroy(pthread_rwlock_t *lock);
3.3 条件变量
本身不是锁,等待某个条件满足,但会结合互斥锁来使用
pthread_cond_t cond;
int pthread_cond_init(pthread_cond_t *cond, const pthread_condattr_t * attr);//动态
cond = PTHREAD_COND_INITIALIZER//静态
//初始化
int pthread_cond_wait(pthread_cond_t *cond,pthread_mutex_t *mutex);
int pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t * mutex, const struct timespec *abstime);
//等待条件
/*
阻塞等待cond,并释放mutex
收到signal后,重新给mutex上锁
*/
int pthread_cond_signal(pthread_cond_t *cond);
int pthread_cond_broadcast(pthread_cond_t *cond);
//通知等待满足
int pthread_cond_destroy(pthread_cond_t *cond);
3.4 信号量
相当于初始化为N的互斥量
sem_r sem;
sem_init(sem_t *sem, int pshared,int value);
//pshared --0 线程同步
// --1 进程同步
sem_t * sem_open(const char *name, int oflag, ...);
sem_wait(sem_t *sem);
sem_trywait(sem_t *sem);
sem_post(sem_t *sem);
网友评论