共享内存环境中互斥的C语言实现

共享内存环境中互斥的C语言实现,c,multithreading,mutex,shared-memory,producer-consumer,C,Multithreading,Mutex,Shared Memory,Producer Consumer,我想实现(C)一个基于共享内存的通信生产者/消费者机制。它取代了客户端和远程服务器之间的流套接字通信。网络中的节点共享一个内存池以相互通信。服务器可以在内存区域中写入数据(生成),而客户端应该读取数据(使用)。 我的软件实际上使用一个线程进行读取(客户端)和一个线程进行写入(服务器端)。线程驻留在不同的机器上(分布式) 实现互斥以访问共享内存区域的最佳快速方法是什么?(两台机器的内存都是外部的,只需引用) 如果客户端未读取数据,服务器应自动生成数据(写入);若服务器未写入数据,则客户端应自动使用

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

实现互斥以访问共享内存区域的最佳快速方法是什么?(两台机器的内存都是外部的,只需引用) 如果客户端未读取数据,服务器应自动生成数据(写入);若服务器未写入数据,则客户端应自动使用数据(读取)

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


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

简单的回答是:只要pthread知道您的特定系统,就可以使用pthread互斥机制。否则,您需要查看特定的硬件/操作系统以获得帮助

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

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

互斥对象可以被视为具有两种状态{LOCKED,UNLOCKED}和两种原子操作的对象:

  • 锁定:如果状态为锁定,则锁定直到解锁。将状态设置为锁定并返回
  • 解锁:将状态设置为解锁并返回
通常,操作系统内核通过在抽象互斥对象上实现这些操作来提供互斥对象。例如,Unix的一些变体将互斥量和信号量实现为对文件描述符的操作。在这些系统上,pthread将利用内核设施

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

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

  • 比较并设置:如果内存位置的值为0,则将其设置为值1,否则失败
  • 条件等待:阻塞,直到内存位置的值为0
  • 原子写入:将内存位置设置为0
  • 一般来说,#1和#3使用特殊的CPU指令实现,而#2需要一些内核支持。这几乎就是为什么


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

    有什么理由不只是将原始实现更改为使用本地UNIX套接字?我只是好奇。我确实需要通过共享内存来代替套接字实现进行传输,因为我在移动数据时获得了更好的性能@罗德,你在做这个假设之前就测量过了?考虑到您在任何情况下的网络IO开销,我发现很难相信额外的开销会特别明显。您的问题没有一般性的答案,因为所有这些都取决于系统。如果您使用的是像linux这样的现代POSIX环境,只需使用互斥锁或RWlock,并指定进程共享选项。我还想知道您运行的是什么硬件,它通过网络共享内存。这很有帮助!非常感谢!我的实际解决方案有效地基于锁定标志(1字节)。为了避免数据的不一致性,必须使用原子操作来实现互斥。非常感谢您对性能的考虑#2应该更适合我的情况。我马上就让你去!