线程同步

线程同步

  • 互斥锁mutex
#include <pthread.h>
int pthread_mutex_destroy(pthread_mutex_t *mutex);
int pthread_mutex_init(pthread_mutex_t *restrict mutex, pthread_mutexattr_t *restrict attr);
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
 
 

如果mutex变量是静态分配的(全局变量或static变量),也可以用宏定义PTHREAD_MUTEX_INITIALIZER来初始化,相当与用pthread_mutex_init()初始化并且设置attr为NULL。

    int pthread_mutex_lock(pthread_mutex_t *mutex);
    int pthread_mutex_trylock(pthread_mutex_t *mutex);
    int pthread_mutex_unlock(pthread_mutex_t *mutex);
 
 

trylock失败,返回EBUSY。

为了实现互斥操作,大多数体系结构都提供了swap或exchange指令,该指令的作用是把寄存器和内存单元的数据相交换,由于只有一条指令,保证了原子性。即使是多处理器平台,访问内存的总线周期也有先后,一个处理器上的交换指令执行时,另外一个处理器的交换指令只能等待总线周期。

    pthread_mutex_lock(&m);
    while(a <= 0)
        pthread_cond_wait(&c, &m);
    pthread_mutex_unlock(&m);
 
 

while多执行一次,检测a是否大于0。多线程执行时,一线程响应后a=0;其余线程执行a<=0时阻塞。

上述代码暂不理解

  • 条件变量condition variable
#include<pthread.h>
int pthread_cond_destory(pthread_cond_t *cond);
int pthread_cond_init(pthread_cond_t *restrict cond, const pthread_condattr_t *restrict attr);
pthread_cond_t 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);
int pthread_cond_broadcast(pthread_cond_t *cond);//唤醒所有线程
int pthread_cond_signal(pthread_cond_t *cond); //唤醒一个线程
 
 

一个条件变量总是和一个mutex搭配使用。

pthread_cond_wait()在一个condtion variable上阻塞等待,这个函数做以下三步:

  1. 释放mutex;
  2. 阻塞等待; 1,2合成原子操作。
  3. 当被唤醒时,重新获得mutex并返回(原子性的)。
  • 信号量semaphore

见信号量博文。

  • 其他线程见同步机制 只要有一个线程可以改写数据,就必须考虑线程见同步问题,引入了读者写者锁(Reader-Writer Lock)。

你可能感兴趣的:(线程同步)