gpt4 book ai didi

c++ - 设计低线程争用的多线程聊天服务器

转载 作者:行者123 更新时间:2023-11-27 22:33:04 24 4
gpt4 key购买 nike

我在考虑如何以某种方式使用 C++ 制作一个多线程聊天服务器,从而最大限度地减少线程争用。

在我最初的设计中,我有一个 std::vector服务器中的套接字。当客户端连接到服务器时,套接字被添加到这个套接字 vector 中。

还有一个 std::unordered_map<string, Socket*>允许查找用户名的相应套接字。当客户端使用它的用户名和密码登录时,我们会在 HashMap 中添加一个条目。当用户注销时,我们删除 HashMap 中的相应条目。

客户端将向用户名发送消息。当他们到达服务器时,我们使用 HashMap 查找套接字,并通过该套接字发送消息。

由于服务器是多线程的,并且可以从不同的线程读取/写入上述数据结构,我们现在需要使用一些线程同步机制(例如互斥锁)来保护它们。但我认为这样做会因为线程争用而降低性能。基本上,所有线程都需要访问这些数据结构才能发送消息,但只有其中一个线程可以同时使用它们。我认为这种方法的性能不会比使用单线程好多少。

如何改进我的设计以获得更好的性能?

最佳答案

第一个简单的解决方案:
如果你在服务器上有足够的资源或者客户端不多,我建议在这里避免大部分的多线程复杂性,并将所有发送或接收功能放在一个线程中(一个用于发送,另一个用于接收操作)。因此,线程有它们的工作套接字,只保留发送和接收客户端队列的锁。这些锁可以由生产者/消费者模式处理。

更高级但也更复杂的解决方案:您必须使用更优化的结构。使用“unordered_map”对象会使您的套接字搜索机制非常低效。另外,你不应该在需要锁的地方使用独占锁,也可以考虑在任何可能的地方使用非独占锁。
无论如何,最好利用现有的线程安全和无锁库。你可以在网上找到很多。我在 Google 上为您搜索了一个:
https://github.com/khizmax/libcds

关于c++ - 设计低线程争用的多线程聊天服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58512330/

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