一、互斥锁
1、概念: 实现线程访问临界资源的同步控制。 如果一个线程在临界区开始时,给互斥锁加锁, 那么其他的线程就必须等待线程解锁, 才能接着运行, 并访问资源。
操作: ①初始化, ②加锁,③ 解锁,④ 销毁锁
2、互斥锁类型
: pthread_mutex_t
3、锁初始化:
int pthread_mutex_init(pthread_mutex_t*mutex,pthread_mutexattr_t *attr);
4、加锁:
int pthread_mutex_lock(pthread_mutex_t *mutex);
5、解锁:
int pthread_mutex_unlock(pthread_mutex_t *mutex);
6、销毁锁:
int pthread_mutex_destroy(pthread_mutex_t *mutex)
7、总结:当两个线程要访问同一个资源时,一个线程占用后会给该资源加锁使得其它线程无法访问,当它使用完时,再将该资源解锁,让其他线程使用。加锁后必须要解锁,而且线程不能随便加锁,只有该资源是解锁状态才能加锁。
二、信号量
1、概念:信号量就相当于一个标志,开始时是0,P操作将信号量减1,V操作是将信号量加1。如果信号量是0时,去执行P操作,线程就会阻塞,只有当信号量大于0时才能够实行P操作。
函数: #include “semaphore.h”
2、初始化:int sem_init(sem_t *sem, int pshared, int val);
①pshared控制信号量的类型,当传递为0时,表示这个信号量只能在这个进程中使用,非0时可以在多个进程间共享。目前Linux不支持非0。
3、P操作:int sem_wait(sem_t *sem); –》-1
4、V操作:int sem_post(sem_t *sem); –》 +1
5、销毁:int sem_destroy(sem_t *sem);
6、总结:在资源同步中,当,两个线程要使用一个资源时,有一个要先使用,我们可以将这个线程进行V操作,另一个线程进行P操作。如果第一个线程还没使用这个资源,那么在运行第二个线程时由于信号量是0,运行P操作是会阻塞,直到第一个线程进行V操作,将信号量变为1。这样就实现了线程的同步控制。
Linux中同步控制
最新推荐文章于 2021-05-13 19:54:46 发布