系统编程--线程

一、线程概念

线程:有独立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);






image.png

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

你可能感兴趣的:(系统编程--线程)