Linux 使用共享内存时,如何在没有选择的情况下阻止线程?

Linux 使用共享内存时,如何在没有选择的情况下阻止线程?,linux,multithreading,shared-memory,Linux,Multithreading,Shared Memory,我有一个应用程序捕获采样数据,并将采样写入一个共享内存段,该内存段的结构为循环缓冲区。我有第二个应用程序读取共享内存。所有共享内存都使用互斥锁进行适当的序列化。我可以完全控制第一个应用程序,使用msg队列通道来启动和停止捕获过程 我的问题是,如何正确地构建第二个应用程序的读取线程,该应用程序将读取共享内存段以处理数据。目前,我已经编写了基本的测试例程来验证共享内存的读取是否准确,互斥锁是否正常工作。但我并不确定如何最好地为第二个应用程序设计实际的阅读线程 我非常喜欢专用pthread的简单性,它

我有一个应用程序捕获采样数据,并将采样写入一个共享内存段,该内存段的结构为循环缓冲区。我有第二个应用程序读取共享内存。所有共享内存都使用互斥锁进行适当的序列化。我可以完全控制第一个应用程序,使用msg队列通道来启动和停止捕获过程

我的问题是,如何正确地构建第二个应用程序的读取线程,该应用程序将读取共享内存段以处理数据。目前,我已经编写了基本的测试例程来验证共享内存的读取是否准确,互斥锁是否正常工作。但我并不确定如何最好地为第二个应用程序设计实际的阅读线程

我非常喜欢专用pthread的简单性,它使用select()阻塞数据,直到数据准备好读取为止。我经常使用这种设计,但这种方法在使用共享内存时似乎不合适,因为文件描述符与共享内存段不关联,所以我不能使用select()。出于某种原因,将pthread与while循环一起使用,并定期调用sleep(),这似乎不是正确的方法

所以我的问题是,在第一个应用程序将数据写入共享内存之前,构建读取线程的优雅方式是什么?我能想到的唯一方法是,每次我希望第二个应用程序从共享内存段读取缓冲区时,使用一个额外的消息队列向它发送消息。还有更优雅的方式吗

谢谢,
-安德烈斯你有很多选择。可以将进程共享条件变量与进程共享互斥体一起使用,也可以使用、使用或使用。通常,共享内存中的进程共享条件变量和互斥体是最佳选择。

我已经在为共享内存段使用进程共享互斥体。两个读/写进程都可以访问互斥体,并且互斥体工作正常。我不知道的是如何设计阅读线程。如果没有数据可读取,线程仍将始终获取互斥锁,这只会耗尽CPU周期。@AndresGonzalez啊,对不起,这就是进程共享条件变量的用途(与进程共享互斥锁一起使用)。(答案更新。)我经常在pthread中使用条件变量,但没有意识到它们也可以像互斥锁一样被进程共享——这是有道理的。谢谢你的帮助。