如何开始学习C++多线程编程?

3

我正在尝试作为个人项目实现自己的IRC客户端,意识到需要一种同时读写套接字的方法。我认识到可以有一个读取线程在后台从套接字中读取数据并将数据放入队列中,还可以有另一个线程从队列中写入数据到套接字中。然而,我不知道如何开始进行多线程编程或如何在C++中实现它。我该从哪里开始?


3
我认为标题和内容不符,或者你在文章中间改变了问题,这很令人困惑。您是想学习如何使用套接字(异步或同步方式?),还是要学习如何生成一个新线程? - Warty
3
@ItzWarty,我认为很清楚...发帖者想要学习如何在C++中生成一个新线程。关于套接字的内容只是为了让我们知道他将在哪些情境下使用这些线程。 - Kiril
《C++并发实战:实用多线程》即将出版(9月)。第一稿非常不错,介绍了C++0x的新线程设施(Boost.Thread“密切遵循提交给C++标准委员会的建议”)。作者是Anthony Williams http://www.boost.org/doc/libs/release/libs/thread/。 - anno
1
线程是并行化CPU密集型计算的正确方式。但对于I/O并行化来说,这是错误的方式,因为你只会为上下文切换和同步/锁定付出额外代价,而不会减少复杂性。 - Ben Voigt
5个回答

10

针对C++线程,boost::thread(即即将发布的std::thread)是最佳选择。尽管如此,在确定线程是您特定情况下正确的解决方案之前,我想提一下select和非阻塞套接字是一种常见方法,用于在不需要线程的情况下交错读取/写入和写入多个套接字。 boost::asio库以跨平台、C++方式包装了select和非阻塞套接字的功能。


2
一旦有了 boost.threads,使用 boost.asio 处理 OP 的套接字只是小菜一碟。 - Cubbi
感谢您提供关于boost::thread和非阻塞套接字的信息。 - Zameer Manji

5

这个指南是针对C和Unix系统的,但我想不出比Beej的网络编程指南更好的起点了。"你将从教导我的绝地大师那里学到知识。"

您将学习如何基础读写套接字,更重要的是,多线程并不一定是正确的答案。


3
@thyrgle,我正在回答OP中半隐藏的“用C ++实现IRC客户端”的问题。我真的想在这里提供帮助。问题的文字暗示了OP在学习这个材料的早期阶段。在那个阶段很难提出正确的问题。 - Michael Kristofik

3
我建议使用 Qt Threading。它有非常出色的示例代码,几乎覆盖了每个功能,并且文档十分详细。此外,它现在是LGPL许可证,可以在大多数平台上运行,并且将源代码与二进制文件一起提供。它还具有非常好的网络支持。
无论你选择哪种方式,请确保它们有良好的文档和示例。

0
我建议看看POCO库。在我看来,它们比boost更容易上手,并且有出色的文档。这些库为编写多线程网络代码提供了很好的框架。你可以从中学到很多知识并且快速上手。

0

我建议使用ACE。它具有许多操作系统功能的可移植抽象(*nix,Windows等):BSD套接字、线程、互斥量、信号量等 - 只需编写一次,随处编译(请参见ACE的ACE_OS命名空间)。

它有很多网络应用程序模式可供使用(对于初学者来说,ACE_Reactor是一个不错的选择),但您也可以使用BSD函数的可移植抽象(socket、send、recv、close、select - 这些足以满足您的IRC客户端需求)。

如先前所述,boost也是一个选择,通常提供每个操作系统的可移植抽象的任何跨平台库(如果您想要进行图形化部分,则可以考虑wxWidgetsqt)。

还有一个建议:除非你真的需要,否则不要使用线程。它们并不像看起来那么简单。

当涉及到网络通信时,我相信你想做的事情在单线程应用程序中是很容易实现的(ACE_Reactor在这方面帮助很大,但你也可以自由使用BSD套接字函数)。首先了解套接字的工作原理,然后 - 如果你愿意的话 - 了解反应器如何在其网络应用模式中利用套接字(ACE_ReactorACE_Event_Handler对象一起工作)。

希望对你有所帮助!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接