我正在尝试作为个人项目实现自己的IRC客户端,意识到需要一种同时读写套接字的方法。我认识到可以有一个读取线程在后台从套接字中读取数据并将数据放入队列中,还可以有另一个线程从队列中写入数据到套接字中。然而,我不知道如何开始进行多线程编程或如何在C++中实现它。我该从哪里开始?
我正在尝试作为个人项目实现自己的IRC客户端,意识到需要一种同时读写套接字的方法。我认识到可以有一个读取线程在后台从套接字中读取数据并将数据放入队列中,还可以有另一个线程从队列中写入数据到套接字中。然而,我不知道如何开始进行多线程编程或如何在C++中实现它。我该从哪里开始?
针对C++线程,boost::thread(即即将发布的std::thread
)是最佳选择。尽管如此,在确定线程是您特定情况下正确的解决方案之前,我想提一下select和非阻塞套接字是一种常见方法,用于在不需要线程的情况下交错读取/写入和写入多个套接字。 boost::asio库以跨平台、C++方式包装了select和非阻塞套接字的功能。
这个指南是针对C和Unix系统的,但我想不出比Beej的网络编程指南更好的起点了。"你将从教导我的绝地大师那里学到知识。"
您将学习如何基础读写套接字,更重要的是,多线程并不一定是正确的答案。
我建议使用ACE。它具有许多操作系统功能的可移植抽象(*nix,Windows等):BSD套接字、线程、互斥量、信号量等 - 只需编写一次,随处编译(请参见ACE的ACE_OS命名空间)。
它有很多网络应用程序模式可供使用(对于初学者来说,ACE_Reactor是一个不错的选择),但您也可以使用BSD函数的可移植抽象(socket、send、recv、close、select - 这些足以满足您的IRC客户端需求)。
如先前所述,boost也是一个选择,通常提供每个操作系统的可移植抽象的任何跨平台库(如果您想要进行图形化部分,则可以考虑wxWidgets、qt)。
还有一个建议:除非你真的需要,否则不要使用线程。它们并不像看起来那么简单。
当涉及到网络通信时,我相信你想做的事情在单线程应用程序中是很容易实现的(ACE_Reactor在这方面帮助很大,但你也可以自由使用BSD套接字函数)。首先了解套接字的工作原理,然后 - 如果你愿意的话 - 了解反应器如何在其网络应用模式中利用套接字(ACE_Reactor与ACE_Event_Handler对象一起工作)。
希望对你有所帮助!