进程间通信学习笔记-互斥锁 && 读写锁

第七章 互斥锁和条件变量
互斥锁是用于保护临界区的,实际上是保护在临界区中被操纵的数据,保护多个线程或者多个进程的共享数据。

#include<pthread.h>
int pthread_mutex_lock(pthread_mutex_t *mptr);
int pthread_mutex_trylock(pthread_mutex_t *mptr);
int pthread_mutex_unlock(pthread_mutex_t *mptr);

如果互斥锁已被其他线程占据了,那么pthread_mutex_lock将阻塞直到互斥锁被解锁。第二个函数在这种情况下,会返回一个EBUSY错误。

如果互斥锁是静态分配 的,可以用PTHREAD_MUTEX_INITIALIZER初始化为常量。如果互斥锁是动态分配的,就要用pthread_mutex_init()函数初始化。

对比上锁与等待
这个例子中,所有生产者线程都启动后,立即启动消费者线程。所以对消费者进行了改动,要判断当前消费的i是否已经生产好了。每次对共享数据进行访问时,都要申请互斥锁。

条件变量:等待与信号发送
互斥锁用于上锁,条件变量用于等待

#include<pthread.h>
int pthread_cond_wait(pthread_cond_t *cptr,pthread_mutex_t *mptr);
int pthread_cond_signal(pthread_cond_t *cptr);

pthread_cond_wait等待某个条件为真时。这个函数原子地执行以下两步:

给互斥锁解锁
把调用线程投入睡眠,知道另外其某个线程就本条件变量调用pthread_cond_signal函数
然后在这个函数返回前,对互斥锁进行上锁,修改共享数据,然后对互斥锁进行解锁

7.6 条件变量:定时等待和广播、
单播和广播,根据满足条件后,要唤醒因为此条件而阻塞所有线程,还是一个等待线程而采用广播和单播发送。

#include<pthread.h>
int pthread_cond_broadcast(pthread_cond_t *cptr);
int pthread_cond_timedwait(pthread_cond_t *cptr,pthread_mutex_t *mptr, const struct timespec *abstime);

pthread_cond_timedwait函数线程就阻塞时间设置一个限制值。如果发生超时,就返回ETIMEDOUT错误
时间值是绝对时间

7.7 互斥锁和条件变量的属性

#include<pthread.h>
int pthread_mutex_init(pthread_mutex_t *mptr, const pthread_mutexattr_t *attr);
int pthread_mutex_destroy(pthread_mutex_t *mptr);
int pthread_cond_init(pthread_cond_t *cptr,pthread_condattr_t *attr);
int pthread_cond_destroy(pthread_cond_t *cptr);

互斥变量和条件变量用以上函数进行初始化和摧毁

#include<pthread.h>
int pthread_mutexattr_init(pthread_mutexattr_t *attr);
int pthread_mutexattr_destroy(pthread_mutexattr_t *attr);
int pthread_condattr_init(pthread_condattr_t *attr);
int pthread_condattr_destroy(pthread_condattr_t *attr);

以上函数是对互斥锁、条件变量的属性进行初始化和摧毁

第八章 读写锁
读写锁的分配规则:

没有线程持有某个给定的读写锁用于写,就可以有任意数目的线程持有读写锁用于读
仅当没有线程持有某个给定的读写锁用于读或用于学,才能分配这个读写锁用于写

这种对于给定资源的共享访问称为共享-独占上锁。对于读是共享锁,对于写是独占锁

#include<pthread.h>
int pthread_rwlock_rdlock(pthread_rwlock_t *rwptr);
int pthread_rwlock_wrlock(pthread_rwlock_t *rwptr);
int pthread_rwlock_unlock(pthread_rwlock_t *rwptr);

int pthread_rwlock_tryrdlock(pthread_rwlock_t *rwptr);
int pthread_rwlock_trywrlock(pthread_rwlock_t *rwptr);

int pthread_rwlock_init(pthread_rwlock_t *rwptr,const pthread_rwlockattr_t *attr);
int pthread_rwlock_destroy(pthread_rwlock_t *rwptr);

int pthread_rwlockattr_init(pthread_rwlockattr_t *attr);
int pthread_rwlockattr_destroy(pthread_rwlockattr_t *attr);

线程取消

#include<pthread.h>
int pthread_cancel(pthraed_t pid);

void pthread_cleanup_push(void (*func)(void*),void *arg);
void pthread_cleanup_pop(int execute);

通过由对方调用函数pthread_cancel,一个线程可以被同一个进程内的任何其他线程所取消(cancel)
清理处理晨旭可以恢复任何需要恢复的状态。push函数中func参数是调用线程被取消是所调用的函数的地址。pop函数是删除调用线程的取消清理栈中位于在山顶的函数中的execute参数不为0时,就是调用这个函数、
————————————————
版权声明:本文为CSDN博主「原来如此sothat」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/yuanlairuci1992/article/details/52139232

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Linux下的进程间通信(IPC)方式有很多种,其中无亲缘关系的进程间通信方式包括互斥锁、条件变量和共享内存。 互斥锁是一种保护共享资源不被并发访问的机制。当进程需要访问共享资源时,它会尝试获取互斥锁。如果锁已经被其他进程占用,则进程会被阻塞,直到锁被释放。这样可以确保同一时间只有一个进程能够访问共享资源,从而避免了竞争条件和数据不一致的问题。 条件变量是一种进程间通信方式,用于线程同步和条件同步。使用条件变量可以实现进程的等待和唤醒操作,从而控制进程的执行顺序。当一个进程需要等待某个条件成立时,它会调用条件变量的等待操作,该操作会阻塞进程并释放对共享资源的占用。当条件满足时,其他进程可以通过唤醒操作通知等待的进程继续执行。 共享内存是一种能够在不同进程之间共享数据的机制。通过共享内存,可以将一块内存空间映射到不同的进程地址空间,从而实现进程间的数据共享。多个进程可以直接访问共享内存,从而实现高效的数据传递。但需要注意的是,由于共享内存不提供进程间同步和互斥机制,因此在使用共享内存进行进程间通信时,需要结合其他同步机制(如互斥锁)确保数据的一致性和正确性。 综上所述,互斥锁、条件变量和共享内存是Linux下无亲缘关系的进程间通信的重要方式。通过这些方式,进程可以进行数据共享和同步,从而实现协作和协同操作。但在使用这些机制时,需要注意进程同步和互斥的问题,以确保数据的正确性和一致性。 ### 回答2: Linux中的进程间通信(IPC)是指不同进程之间进行数据交换和共享资源的方法。在Linux中,有多种IPC机制可以实现进程间的通信,包括管道、消息队列、信号量、共享内存和套接字等。其中,互斥锁、条件变量和共享内存是常用的进程间通信方式。 互斥锁是一种同步原语,用于保护共享资源的访问。当一个进程正在使用共享资源时,可以通过申请互斥锁来锁定资源,防止其他进程同时访问。只有当拥有互斥锁的进程释放锁时,其他进程才能竞争获取锁。 条件变量通常与互斥锁一起使用,用于实现在特定条件下的线程等待和唤醒操作。一个进程可以通过条件变量来等待某个特定条件的发生,如果条件不满足,则该进程将等待在条件变量上。当另一个进程满足了条件并发送了信号时,该进程就会被唤醒。 共享内存是一种用于实现进程间数据共享的技术。它允许多个进程直接访问同一块内存区域,而无需进行数据的拷贝和传输。进程可以通过映射共享内存到自己的地址空间上来实现对共享内存区域的访问。在使用共享内存时,需要使用互斥锁等同步机制来保证多个进程对于共享内存的访问是安全的。 总之,互斥锁、条件变量和共享内存是Linux中常用的进程间通信方式,它们通过提供同步机制和共享资源访问的方法,实现了不同进程之间的数据交换和资源共享。这些机制在多进程编程中非常重要,可以有效提高程序的并发性能和效率。 ### 回答3: 在Linux下,无亲缘关系的进程间通信可以利用互斥锁、条件变量和共享内存来实现。以下是对每种通信方式的详细描述: 1. 互斥锁互斥锁是一种用于保护共享资源的同步机制,确保在同一时刻只有一个进程可以访问被保护的资源。在无亲缘关系的进程间通信中,可以使用互斥锁实现对共享资源的互斥访问。当一个进程想要访问共享资源时,它会先检查互斥锁的状态。如果互斥锁已被其他进程持有,则该进程将被阻塞,直到互斥锁变为可用状态。一旦该进程获得互斥锁,它就可以访问共享资源,完成操作后释放互斥锁。 2. 条件变量:条件变量用于进程间的协调和同步。当一个进程需要等待某个条件满足时,它可以通过条件变量来进行等待,并在条件变量满足时被唤醒。在无亲缘关系的进程间通信中,可以使用条件变量实现多个进程之间的等待和唤醒机制。当一个进程需要等待某个条件满足时,它可以调用等待函数,将自己放入条件变量的等待队列中并阻塞。当另一个进程满足了条件后,它可以通过唤醒函数来通知等待的进程,使其重新运行。 3. 共享内存:共享内存是一种让多个进程可以访问同一块内存区域的方式。在无亲缘关系的进程间通信中,可以使用共享内存实现进程间的数据共享。多个进程可以将需要共享的数据映射到同一块共享内存区域,并利用该内存区域进行数据的读写操作。通过共享内存,进程可以直接读写共享数据,而无需通过其他的通信机制。此外,为了保证数据的一致性和并发访问的正确性,通常还需要使用互斥锁或其他同步机制来控制对共享内存的访问。 综上所述,Linux提供了互斥锁、条件变量和共享内存这几种机制来实现无亲缘关系的进程间通信,进程可以通过这些通信方式来进行资源的互斥访问、进程之间的协调和同步,以及共享数据的传递。通过合理地选择和使用这些通信方式,可以实现高效、可靠的进程间通信

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值