当前位置: 首页 > 知识库问答 >
问题:

多线程C 11应用程序中的同步

陆承宣
2023-03-14

我在一个用C语言编写的多线程html" target="_blank">服务器应用程序上工作,并在嵌入式Linux上执行。一个线程(我称之为通信线程)应该处理所有套接字I/O(发送和接收消息)。依赖于接收到的消息,通信线程将消息发送到另一个线程(例如Thread)。Controller-Thread)处理所需的序列。控制器线程在序列的末尾创建返回消息。此消息被写回通信线程,该线程应该将它们传输到客户端。

这两个线程之间的通信是通过队列实现的,队列通过互斥和条件_变量进行保护。现在,当通信线程收到套接字消息时,它会将它们传输到控制器线程,并等待来自控制器线程的消息。因此,多线程架构没有带来任何好处。我的目标是在通信线程中等待套接字消息或“排队”消息。

为此,我想改变线程之间的队列实现,并用管道或事件替换它们。然后,我将使用通信线程中的选择()函数来同时观察队列和套接字。但是我对这个解决方案的性能有些担忧。有人对这个问题有更好的主意或解决方案吗?

问题:

我会同时观察一个套接字和多线程应用程序中的某种消息。对于这种类型的问题,有人知道比管道或eventfd更有效的实现吗?

感谢关于这个话题的任何提示

共有1个答案

子车高超
2023-03-14

如果您的嵌入式Linux版本上有boost::asio,请使用它。它的设计正是为了做你想要的,有一个很好的界面和非常好的功能。看看教程。这需要一点时间来适应,但它使多线程网络应用程序更容易。

 类似资料:
  • 我对最新gcc中基于pthread和Ubuntu开发环境的线程的互斥锁和消息传递的性能感兴趣。一个很好的通用问题是用餐哲学家,每个哲学家使用lh和rh叉子与左右手邻居共享。我把哲学家的数量增加到99个,让我的四核处理器保持忙碌。 上面的代码允许我的哲学家尝试抓住他们需要的两个叉子。 上面的代码监控我的哲学家的进食或思考进度,这取决于他们是否能够保留这两个叉子。 在所有哲学家尝试自由选择后,等待所有

  • 问题内容: 在多线程应用程序中如何使用Hibernate(例如,每个客户端连接在服务器上启动它自己的线程)。 EntityManager应该仅由EntityManagerFactory创建一次,例如: 还是我必须为每个线程以及关闭EM的每个事务重新创建实体? 我的CRUD方法如下所示: 我要不要每次都跑?还是因为每个人都使用自己的缓存创建自己的EntityManager实例而使我陷入麻烦了? 问题

  • 问题内容: 自两年以来,我一直在使用java(Servlets,JSPs)进行Web应用程序开发。在那两年中,我从不需要在任何项目中使用(明确地- 众所周知,servlet容器使用线程为不同的请求提供相同的servlet)。 但是,每当我参加Web开发人员职位(java)的面试时,就会有几个与java中的线程相关的问题。我知道Java线程的基础知识,因此回答问题不是问题。但是有时我会感到困惑,是否

  • 那么,这种架构的瓶颈在哪里?也许推送每条带有互斥体的消息是个坏主意?

  • 问题内容: 为了在Linux上开发高度网络密集型服务器应用程序,首选哪种架构?这个想法是,该应用通常可以在具有多个内核(虚拟或物理)的机器上运行。考虑到性能是关键标准,选择多线程应用程序还是采用多进程设计更好?我确实知道资源共享和从多个进程访问此类资源的同步是很多编程开销,但是如前所述,整体性能是关键要求,因此我们可以忽略这些事情。编程语言为C / C ++。 我听说,即使是多线程应用程序(单个进

  • 我有一个多线程应用程序,它有一个生产者线程和几个消费者线程。数据存储在一个共享的线程安全集合中,当缓冲区中有足够的数据时,就刷新到数据库中。 来自爪哇文档 - 一个队列,它还支持在检索元素时等待队列变为非空,并在存储元素时等待队列中的空间变为可用。 检索并删除此队列的头部,如有必要,请等待元素可用。 我的问题是- < li >是否有另一个集合具有E[] take(int n)方法?即阻塞队列等待,