linux线程篇 (三) 线程的同步
pthreat_mutex_t mymutex; //1. 创建 初始化 int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *attr); //pthread_mutex_t *mutex 要初始化的互斥量 //const pthread_mutexattr_t *attr 互斥量的属性,默认为NULL //2.动态创建的互斥量要在线程结束的时候销毁互斥量 int pthread_mutex_destroy(pthread_mutex_t *mutex); //pthread_mutex_t *mutex 要销毁的动态创建的互斥量
//3. 加锁 int pthread_mutex_lock(pthread_mutex_t *mutex); //如果该互斥量已经被锁住,再次解锁就会造成阻塞,死锁。 int pthread_mutex_trylock(pthread_mutex_t *mutex); //即使互斥量被锁住,再次尝试加锁也不会造成阻塞,而是返回错误码
//4. 解锁int pthread_mutex_unlock(pthread_mutex_t *mutex);
//互斥量 同一时刻只有1个线程能访问互斥量锁住的数据 //读写锁有更高的并行性 pthread_rwlock_t rwlock; //读模式加锁 //写模式加锁 //不加锁 //一次只有1个线程可以拥有写模式 和互斥量一致 //但是允许多线程在读模式下加锁
//1.初始化 int pthread_rwlock_init(pthread_rwlock_t *lock, const pthread_rwlockattr_t *attr); //2.读锁 int pthread_rwlock_rdlock(pthread_rwlock_t *lock); int pthread_rwlock_tryrdlock(pthread_rwlock_t *lock); //3.写锁 int pthread_rwlock_wrlock(pthread_rwlock_t *lock); int pthread_rwlock_trywrlock(pthread_rwlock_t *lock); //4. 解锁 int pthread_rwlock_unlock(pthread_rwlock_t *lock);
3 条件变量
//当互斥锁锁住的时候,但是因为不满足执行条件,就会造成阻塞,无法释放,这时候就需要一种机制来释放该锁 pthread_cond_t cond;
//1. 初始化 int pthread_cond_init(pthread_cond_t *cond, const pthread_condattr_t *attr); //2.销毁 int pthread_cond_destroy(pthread_cond_t *cond); //3.使用 int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex); //配合互斥量 //4.唤醒 int pthread_cond_broadcast(pthread_cond_t *cond); int pthread_cond_signal(pthread_cond_t *cond);