【发布时间】:2019-10-22 21:07:21
【问题描述】:
我在考虑如何以某种方式使用 C++ 制作多线程聊天服务器,从而最大限度地减少线程争用。
在我的初始设计中,我在服务器中有一个std::vector 的套接字。当客户端连接到服务器时,套接字被添加到这个套接字向量中。
还有一个std::unordered_map<string, Socket*> 允许查找用户名的相应套接字。当客户端使用它的用户名和密码登录时,我们会在哈希映射中添加一个条目。当用户注销时,我们删除哈希映射中的相应条目。
客户端将发送以用户名为地址的消息。当他们到达服务器时,我们使用哈希映射来查找套接字,并通过该套接字发送消息。
由于服务器是多线程的,并且上面提到的数据结构可以从不同的线程读取/写入,我们现在需要使用一些线程同步机制来保护它们,例如互斥锁。但我认为这样做会因为线程争用而降低性能。基本上,所有线程都需要访问这些数据结构才能发送消息,但只有一个线程可以同时使用它们。我认为使用这种方法的性能不会比使用单线程更好。
如何改进我的设计以获得更好的性能?
【问题讨论】:
-
目标平台是什么?
-
您希望同时支持多少用户? (我问是因为通常人们不会很快打字,所以即使有大量用户,您的服务器也可能花费 99.9% 的时间来等待任何人向它发送一些文本,这意味着多线程设计可能会矫枉过正,因为单核会很快)
-
@JeremyFriesner 这只是出于学习目的,我不希望很快有用户。我认为你是对的,我最好使用单线程,但我很好奇人们如何有效地执行多线程
标签: c++ multithreading network-programming