IO进、线程——进程间通信的同步与互斥。信号量、互斥锁(PV操作)和条件变量

一、进程间通信的同步与互斥

在多进程编程中,进程之间可能会共享某些资源,例如共享内存、文件、数据库等。当多个进程同时访问这些共享资源时,就会产生竞争条件(Race Condition),导致数据不一致或者出现错误。为了避免竞争条件,保证进程之间的正确协作,需要使用同步与互斥机制来对共享资源进行管理。

二、同步与互斥的概念

①同步(Synchronization)顺序进行访问
多个进程在访问共享资源时,通过一定的机制保证它们按照一定的顺序进行访问,避免产生竞争条件。同步机制用于协调多个进程的执行顺序,确保它们按照预定的逻辑执行。

②互斥(Mutual Exclusion)只允许一个线程访问
多个进程在访问共享资源时,通过一定的机制保证同时只有一个进程可以访问该资源其他进程必须等待。互斥机制用于防止多个进程同时访问共享资源,避免产生竞争条件

三、同步与互斥的实现

1. 信号量(Semaphore)

信号量是一种用于进程间同步与互斥的机制,它可以用来控制对共享资源的访问。信号量维护一个整数值,当进程访问共享资源时,首先尝试对信号量进行操作。如果信号量值大于0,则表示资源可用,进程可以访问资源并将信号量值减一。如果信号量值等于0,则表示资源不可用,进程需要等待,直到资源可用为止。

①初始化信号量

#include 

int sem_init(sem_t *sem, int pshared, unsigned int value);

功能:初始化信号量
返回值:成功返回0,失败返回-1
参数说明:
sem:指向要初始化的信号量对象(名字)
pshared:指定信号量的共享方式,0表示线程间共享,非0表示进程间共享
value:信号量的初始值

②销毁信号量

int sem_destroy(sem_t *sem);

功能:销毁信号量
返回值:成功返回0,失败返回-1
参数说明:
sem:指向要销毁的信号量的指针

③等待信号量(申请)P操作

int sem_wait(sem_t *sem);

功能:等待(申请)信号量。向系统申请某个信号量资源,如果资源个数为0,那么程序会阻塞等待资源产生;如果有资源,那么程序可以获得资源并继续往后运行,系统中这个资源的个数-1
返回值:成功返回0,失败返回-1
参数说明:
sem:指向要等待的信号量的指针

④释放信号量 V操作

int sem_post(sem_t *sem);

功能:释放信号量。无条件让系统中某个资源的个数+1
返回值:成功返回0,失败返回-1
参数说明:
sem:指向要释放的信号量的指针

2、互斥锁(Mutex)

互斥锁是一种特殊的锁,它用于实现临界区的互斥访问。在进程访问共享资源之前,需要先获得互斥锁,一旦获得锁,其他进程将无法再获得锁,直到当前进程释放锁为止。
临界资源:表示临界代码,需要保护临界代码

①初始化互斥锁

#include 

int pthread_mutex_init(pthread_mutex_t *mutex,
							const pthread_mutexattr_t *mutexattr);

功能:初始化互斥锁。在系统中创建出来一种锁资源,并且初始化其个数为1
返回值:成功返回0,失败返回错误码
参数说明:
mutex:指向要初始化的互斥锁对象
mutexattr:指向互斥锁属性的锁属性,默认属性写NULL

②锁定(申请)互斥锁

int pthread_mutex_lock(pthread_mutex_t *mutex);

功能:锁定(申请)互斥锁。向系统申请一种锁资源,如果系统中有这个锁资源,那么程序可以继续往后运行,并且申请成功过后系统中这个锁资源的个数-1.如果系统中没有这个锁资源,那么程序会阻塞等待资源的产生
返回值:成功返回0,失败返回错误码
参数说明:
mutex:指向初始化好的锁资源

③解锁(释放)互斥锁

int pthread_mutex_unlock(pthread_mutex_t *mutex);

功能:解锁(释放)互斥锁。无条件让系统中这个锁资源的个数+1
返回值:成功返回0,失败返回错误码
参数说明:
mutex:指向要解锁的互斥

尝试锁定互斥锁

int pthread_mutex_trylock(pthread_mutex_t *mutex);

功能:尝试锁定互斥锁
返回值:成功返回0,失败返回错误码
参数说明:
mutex:指向要尝试锁定的互斥锁的指针

在指定的时间范围内尝试锁定互斥锁

int pthread_mutex_timedlock(pthread_mutex_t *mutex,
							 const struct timespec *abstime);

功能:在指定的时间范围内尝试锁定互斥锁
返回值:成功返回0,失败返回错误码
参数说明:
mutex:指向要尝试锁定的互斥锁的指针
abstime:指向指定时间的结构体的指针

销毁互斥锁

int pthread_mutex_destroy(pthread_mutex_t *mutex);

功能:销毁互斥锁
返回值:成功返回0,失败返回错误码
mutex:指向要销毁的互斥锁的指针

3、条件变量

条件变量是一种用于线程之间的同步的机制,它允许线程在满足特定条件之前等待,一旦条件满足,线程将被唤醒继续执行。条件变量通常与互斥锁一起使用,以确保在等待条件时数据不会被破坏。

①初始化条件变量

int pthread_cond_init(pthread_cond_t *cond, 
						const pthread_condattr_t *attr);

功能:初始化条件变量
返回值:成功返回0,失败返回错误码
cond:指向要初始化的条件变量的指针
attr:条件变量的属性,通常设置为NULL表示使用默认属性

②销毁条件变量

int pthread_cond_destroy(pthread_cond_t *cond);

功能:销毁条件变量
返回值:成功返回0,失败返回错误码
cond:指向要销毁的条件变量的指针

③等待条件变量

int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex);

功能:等待条件变量满足
返回值:成功返回0,失败返回错误码
cond:指向要等待的条件变量的指针
mutex:指向已加锁的互斥锁的指针,用于防止竞态条件

④唤醒等待条件变量的线程

int pthread_cond_signal(pthread_cond_t *cond);

功能:唤醒等待条件变量的一个线程
返回值:成功返回0,失败返回错误码
cond:指向要唤醒的条件变量的指针

int pthread_cond_broadcast(pthread_cond_t *cond);

功能:唤醒等待条件变量的所有线程
返回值:成功返回0,失败返回错误码
cond:指向要唤醒的条件变量的指针

你可能感兴趣的:(IO进,线程,c语言,linux)