真的很困惑C ++多线程

时间:2012-04-10 16:04:23

标签: c++ linux multithreading gtk

我正在尝试用C ++编写一些多线程代码,但我似乎无处可去。我做了一些研究,但我很难找到一些基本的例子来告诉我如何实现我的需要。我正在使用Linux中的Gtk应用程序,每次都有耗时的操作,比如加载文件,GUI锁定(如果我尝试移动它,所有控件等都会消失,只留下空白窗口)。这显然可以通过线程解决,但我不知道从哪里开始寻找。我应该使用pthreads,C ++ Thread,boost :: Thread,Glib :: Thread吗?使用上述任何一项的区别和原因是什么?

我的目标是建立一个消息对话框,甚至是一个进度条对话框,可以显示何时在后台运行操作。基本上任何会在完成工作时让GUI响应的东西。我非常感谢一些示例或链接到一些要学习的源代码。

6 个答案:

答案 0 :(得分:5)

现在有一个标准的线程库,所以如果编译器支持它,你应该使用它。

如果您坚持使用旧的编译器,那么Boost.Thread是最佳选择,因为它与标准库非常相似,因此在更新编译器时转换将非常简单。

但是,您最好坚持使用一个线程,并使用异步I / O来避免阻塞。

答案 1 :(得分:2)

这实际上取决于您所处的环境。

如果可能,请使用标准库线程功能。它需要一个最近的编译器(实际上我不确定GCC是否已经完全实现了它),但如果它可用,请使用它。

这是一个非常好的API,它是标准的,可移植的。

我认为POSIX是最后的手段。它是* nix系统中最低级别的共同点,但它不是一个很好用的API。你提到的所有其他人基本上都是围绕这个。另一方面,您可以避免使用第三方依赖项。

我没有使用过Glib :: Thread,但我对Glib的体验是......它有点icky。

如果标准库线程不可用,我首选的库将是Boost。这是一个与std::thread非常相似的API(后者是在Boost.Thread之后建模的),并且效果非常好。

当然,缺点是它取决于第三方库。

答案 2 :(得分:2)

c ++中的线程在C ++ 11之前是依赖于平台的(例如pthreads vs windows threads),因为通常需要与内核进行交互。 boost:Thread是独立于平台的方式(它是平台相关的东西)或C ++ 11,如果你有权访问它,也支持线程(基于boost :: thread)。

如果您不关心除了正在使用的平台之外的任何平台,那么我在Linux上使用了pthreads,在Windows上使用了常规的win32线程,这两个版本都很容易启动和运行。

答案 3 :(得分:2)

当您使用GTK时,您需要考虑一些事项。 GTK是线程感知但不是线程安全的。它提供了由gdk_threads_enter()和gdk_threads_leave()控制的全局锁,它保护GTK +的所有使用。也就是说,在任何给定时间只有一个线程可以使用GTK +。回调需要一点关注。 GTK +(信号)的回调是在GTK +锁内完成的。但是,GLib(超时,IO回调和空闲函数)的回调是在GTK +锁之外进行的。因此,在信号处理程序中,您不需要调用gdk_threads_enter(),但在其他类型的回调中,您可以这样做。

阅读本文以获取更多信息:

http://blogs.operationaldynamics.com/andrew/software/gnome-desktop/gtk-thread-awareness

http://www.yolinux.com/TUTORIALS/GTK+ProgrammingTips.html

http://developer.gnome.org/gtk-faq/stable/x481.html

您可能需要的线程类型是普通的工作线程。当工作在后台完成时,它会让gui响应。然后,gui可以控制工作线程,并通过基于计时器的检查检查工作线程的进度,检查它的操作和更新进度条或显示消息对话框。

在Linux上查看c ++中一般多线程的一些教程:

http://www.tidytutorials.com/2010/06/linux-c-socket-example-with-client.html

http://www.yolinux.com/TUTORIALS/LinuxTutorialPosixThreads.html

http://programming-in-linux.blogspot.jp/2008/03/multithreading-example-in-cc-using.html

答案 4 :(得分:1)

我从未与Gtk合作,但是看GTK+ Programming tips,似乎GDK Threads是最合适的选择。

答案 5 :(得分:0)

win32 API和UNIX的最佳学习方法(运行大量示例代码)。

WIN32 And UNIX Thread & Semaphores