Linux下多线程对同一全局变量的读写可能会因为时序问题产生影响,所以才有了线程同步这一概念,线程同步解决了线程访问问题,同步的方式有以下几种:
互斥锁
pthread_mutex_t lock;
//初始化互斥锁
int ret=pthread_mutex_init(&lock,NULL);
//加锁
pthread_mutex_lock(&lock);
//解锁
pthread_mutex_unlock(&lock);
//销毁锁
pthread_mutex_destroy(&lock);
读写锁
将锁分成读锁和写锁,读可以几个线程同时访问,同一时刻只能有一个写锁可以访问共享资源
//初始化读写锁
pthread_rwlock_init();
//销毁锁
pthread_rwlock_destroy();
//读和写
pthread_rwlock_rdlock();
pthread_rwlock_wrlock();
pthread_rwlock_unlock();
自旋锁
一个线程访问共享资源,其他线程在等待解锁期间自旋,所以自旋锁不应该持有时间过长,时间长最好用信号量。
调用的函数,主要用在多处理器中:
pthread_spin_init();
pthread_spin_destroy();
pthread_spin_lock();
pthread_spin_unlock();
信号量
信号量是一个计数器,用于控制访问共享
//初始化信号量
sem_init();
//信号量-1,表示资源被访问
sem_wait();
//信号量+1,资源未被访问
sem_post();
//销毁信号量
sem_destroy();
条件变量
可以理解为创建两个线程,一个生产者,一个消费者
生产者:生产不超过某一值时,不断生产,超过设定值后阻塞等待消费者消费;
消费者:只要生产数量不为0则继续消费,直到为0时阻塞等待生产。
pthread_cond_init();
pthread_cond_wait();
pthread_cond_signal();
屏障
允许每个线程等待直到所有的合作线程都到达某一点,然后从该点继续执行
本文参考
Linux下线程同步机制(吐血整理)_LUCAS004的博客-CSDN博客_linux多线程同步机制