1

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

我的目标是有一个消息对话框,甚至是一个进度条对话框,它会在后台运行操作时显示。基本上任何东西都会在完成工作时让 GUI 做出响应。我真的很感激一些例子或一些源代码的链接来学习。

4

6 回答 6

5

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

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

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

于 2012-04-10T16:17:08.397 回答
3

当您使用 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

于 2012-04-10T16:24:42.997 回答
2

这真的取决于你工作的环境。

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

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

我认为 POSIX 是一种最后的手段。它是 *nix 系统上最低级别的公分母,但它不是一个很好的 API。您提到的所有其他人基本上都是对此的包装。另一方面,您避免了第三方依赖项。

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

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

当然,缺点是它意味着依赖于第三方库。

于 2012-04-10T16:16:59.890 回答
2

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

如果您不关心您正在使用的平台以外的任何平台,那么我在 linux 上使用了 pthreads,在 Windows 上使用了常规的 win32 线程,这两种线程都非常容易启动和运行。

于 2012-04-10T16:20:57.770 回答
1

我从未使用过 Gtk,但是查看GTK+ 编程技巧,似乎GDK 线程是最合适的选择。

于 2012-04-10T16:19:43.793 回答
0

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

WIN32 和 UNIX 线程和信号量

于 2012-04-15T04:30:47.210 回答