linux之线程的同步(读写锁与互斥锁)

互斥量:要么被加锁要么不加锁,而且同一时刻只允许一个线程对其加锁

  一、互斥量用pthread_mutex_t类型的数据表示,在使用之前需要对互斥量初始化
    1)、如果是动态分配的互斥量,可以调用pthread_mutex_init()函数初始化
    2)、如果是静态分配的互斥量,还可以把它置为常量PTHREAD_MUTEX_INITIALIZER
    3)、动态分配的互斥量在释放内存之前需要调用pthread_mutex_destroy()

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

二、加锁和解锁
加锁 
     int pthread_mutex_lock(pthread_mutex_t *mutex); 
    成功返回0,失败返回错误码。如果互斥量已经被锁住,那么会导致该线程阻塞
      int pthread_mutex_trylock(pthread_mutex_t *mutex);
    成功返回0,失败返回错误码。如果互斥量已经被锁住,不会导致线程阻塞

解锁  
    int pthread_mutex_unlock(pthread_mutex_t *mutex);
    成功返回0,失败返回错误码。如果一个互斥量没有被锁住,那么解锁就会出错

 

读写锁:读写锁与互斥量类似。

               但读写锁有更高的并行性:

                1. 读写锁有三种状态,读模式下加锁(共享)、写模式下加锁(独占)以及不加锁。

                2. 一次只有一个线程可以占有写模式下的读写锁;但是多个线程可以同时占有读模式下的读写锁。

                3. 读写锁在写加锁状态时,其他试图以写状态加锁的线程都会被阻塞。读写锁在读加锁状态时,如果有线程希望以写模式加锁时,必须阻塞,直到所有线程释放锁。

                4、当读写锁以读模式加锁时,如果有线程试图以写模式对其加锁,那么读写锁会阻塞随后的读模式锁请求,以避免读锁长期占用,而写锁得不到请求。

//读写锁初始化
int pthread_rwlock_init(pthread_rwlock_t *restrict rwlock, const pthread_rwlockattr_t *restrict attr);
//读模式加锁
       int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock);
       int pthread_rwlock_tryrdlock(pthread_rwlock_t *rwlock);
//写模式加锁
       int pthread_rwlock_trywrlock(pthread_rwlock_t *rwlock);
       int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock);
//解锁
       int pthread_rwlock_unlock(pthread_rwlock_t *rwlock);
//销毁读写锁
int pthread_rwlock_destroy(pthread_rwlock_t *rwlock);


          

 

 

 

你可能感兴趣的:(嵌入式,Linux,C语言)