在多进程编程中,进程之间可能会共享某些资源,例如共享内存、文件、数据库等。当多个进程同时访问这些共享资源时,就会产生竞争条件(Race Condition),导致数据不一致或者出现错误。为了避免竞争条件,保证进程之间的正确协作,需要使用同步与互斥机制来对共享资源进行管理。
①同步(Synchronization):顺序进行访问
多个进程在访问共享资源时,通过一定的机制保证它们按照一定的顺序进行访问,避免产生竞争条件。同步机制用于协调多个进程的执行顺序,确保它们按照预定的逻辑执行。
②互斥(Mutual Exclusion):只允许一个线程访问
多个进程在访问共享资源时,通过一定的机制保证同时只有一个进程可以访问该资源,其他进程必须等待。互斥机制用于防止多个进程同时访问共享资源,避免产生竞争条件。
信号量是一种用于进程间同步与互斥的机制,它可以用来控制对共享资源的访问。信号量维护一个整数值,当进程访问共享资源时,首先尝试对信号量进行操作。如果信号量值大于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:指向要销毁的信号量的指针
int sem_wait(sem_t *sem);
功能:等待(申请)信号量。向系统申请某个信号量资源,如果资源个数为0,那么程序会阻塞等待资源产生;如果有资源,那么程序可以获得资源并继续往后运行,系统中这个资源的个数-1
返回值:成功返回0,失败返回-1
参数说明:
sem:指向要等待的信号量的指针
int sem_post(sem_t *sem);
功能:释放信号量。无条件让系统中某个资源的个数+1
返回值:成功返回0,失败返回-1
参数说明:
sem:指向要释放的信号量的指针
互斥锁是一种特殊的锁,它用于实现临界区的互斥访问。在进程访问共享资源之前,需要先获得互斥锁,一旦获得锁,其他进程将无法再获得锁,直到当前进程释放锁为止。
临界资源:表示临界代码,需要保护临界代码
#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:指向要销毁的互斥锁的指针
条件变量是一种用于线程之间的同步的机制,它允许线程在满足特定条件之前等待,一旦条件满足,线程将被唤醒继续执行。条件变量通常与互斥锁一起使用,以确保在等待条件时数据不会被破坏。
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:指向要唤醒的条件变量的指针