gpt4 book ai didi

c - 共享内存环境的 C 互斥实现

转载 作者:行者123 更新时间:2023-11-30 17:34:15 25 4
gpt4 key购买 nike

我想实现(C)基于共享内存的通信生产者/消费者机制。它取代了客户端和远程服务器之间的流套接字通信。网络中的节点共享内存池以相互通信。服务器可以在内存区域中写入数据(生产),客户端应该读取数据(消费)。我的软件实际上使用一个线程用于读取(客户端)和一个线程用于写入(服务器端)。线程驻留在不同的机器上(分布式)。

实现互斥访问共享内存区域的最佳且快速的方法是什么? (内存对于两台机器来说都是外部的,只是提到的)如果客户端没有读取,服务器应该自动生成数据(写入);如果服务器没有写入,客户端应该自动消耗数据(读取)。

很明显我需要一个类似 phthread 互斥体的机制。在这种情况下,线程等待通过本地内核中断解锁。phthread 实现也适用于这种分布式场景(锁定变量放置在共享内存中 - 设置 PTHREAD_PROCESS_SHARED 选项)吗?

如何以不同的方式实现快速可靠的互斥体,使客户端线程和服务器线程依次访问共享区域,确保数据一致性?

最佳答案

所以简短的答案是:只要 pthreads 了解您的特定系统,您就可以使用 pthread 互斥机制。否则,您需要查看特定的硬件/操作系统来寻求帮助。

这个长答案有点笼统,因为这个问题没有提供有关正在使用的分布式共享内存的确切实现的大量细节。我将尝试解释什么是可能的,但是如何将取决于实现。

正如@Rod所建议的,生产者-消费者系统可以用一个或多个互斥锁来实现,问题是如何实现互斥锁。

互斥体可以被视为具有两种状态{LOCKED、UNLO​​CKED}和两个原子操作的对象:

  • Lock:如果状态为 LOCKED,则阻塞直到 UNLOCKED。将状态设置为 LOCKED 并返回。
  • 解锁:将状态设置为 UNLOCKED 并返回。

互斥体通常由操作系统内核通过在抽象互斥体对象上实现这些操作来提供。例如,Unix 的某些变体将互斥体和信号量实现为对文件描述符的操作。在这些系统上,pthreads 将利用内核设施。

这种方法的优点是用户空间程序不必关心它是如何实现的。缺点是每个操作都需要调用内核,因此与下一个选项相比,它可能相对较慢:

互斥体也可以实现为一个内存位置(假设为 1 字节长),它存储值 0 或 1 以指示 UNLOCKED 和 LOCKED。可以使用标准内存读/写指令对其进行访问。我们可以使用以下(假设的)原子操作来实现锁定和解锁:

  1. 比较并设置:如果内存位置的值为 0,则将其设置为值 1,否则失败。
  2. 条件等待:阻塞,直到内存位置的值为 0。
  3. 原子写入:将内存位置设置为值 0。

一般来说,#1 和 #3 是使用特殊的 CPU 指令实现的,#2 需要一些内核支持。这几乎就是How pthread_mutex_lock is implemented .

这种方法提供了速度优势,因为仅当互斥体发生争用时(其他人拥有锁)才需要内核调用。

关于c - 共享内存环境的 C 互斥实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23446501/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com