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

时间:2014-03-09 02:53:35

标签: linux multithreading shared-memory

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

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

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

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

谢谢, -Andres

1 个答案:

答案 0 :(得分:1)

你有很多选择。您可以使用流程共享条件变量以及流程共享互斥锁,您可以使用futex,可以使用pipe,也可以使用semaphore。通常,共享内存中的进程共享条件变量和互斥锁是您的最佳选择。