3

我正在寻找一份开发工作,并且看到许多清单指定开发人员必须精通多线程。这出现在 Java 工作列表和涉及 UNIX 上的“系统编程”的 C++ 列表中。

在过去的几年里,我一直在使用 Java 并使用它的各种同步机制。

在 90 年代后期,我做了很多 C++ 工作,尽管线程很少。然而,在大学里,我们在 Solaris 上使用线程。

我的问题是,与 Java 开发人员相比,C/C++ 开发人员面临的问题是否存在显着差异,以及解决这些问题的任何技术是否存在根本不同。Java 显然包括一些更好的机制和集合的同步版本等。

如果我想刷新或重新学习 UNIX 上的线程,最好的方法是什么?我应该看哪个图书馆?等等。目前有一些关于 C++ 线程的很棒的教程吗?

4

6 回答 6

7

线程的基本挑战(例如同步、竞争条件、线程间通信、资源清理),但 Java 通过垃圾收集、异常、高级同步对象、高级调试支持和反射使线程更易于管理。

使用 C++,您更有可能出现内存损坏和“不可能”的竞争条件。而且您将需要编写更多低级线程原语或依赖不属于标准化语言的库(如 boost)。

于 2009-03-13T05:14:49.380 回答
4

C++ 实际上比 Java 更容易编写复杂的线程代码,因为它具有 Java 缺乏的特性——RAII或“资源获取即初始化”。这个习惯用法用于编写良好的 C++ 代码中的所有资源控制,但特别适用于必须自动管理同步的多线程代码。

于 2009-03-13T09:07:02.440 回答
3

垃圾收集使不泄漏内存的编程线程更容易,并且您可以做一些花哨的事情来解决收集的时间问题。

确定性析构函数使不会产生僵尸的编程线程更容易,请参阅此处的 ACM 论文

于 2009-03-13T04:55:49.613 回答
3

看看pthreadsboost(pthreads 是一个随机的 lijnk,但它看起来还可以作为一个起点)。

在高层次上,Java/C/C++/ 的问题是相同的。关于如何解决问题的细节(要调用的函数、要创建的类等)因语言而异。

于 2009-03-13T05:01:23.047 回答
1

这取决于您选择工作的级别。英特尔 TBB 和 OpenMP 从相当高的层次处理了许多常见情况。Posix 线程、Windows API 和 Boost 线程等可移植库使您更接近与 Java 中的原语相同的水平。

C++0x 线程(尤其是获取和释放内存屏障)允许您达到比 Java 提供的更多控制和复杂性的更低级别(volatile在 Java 中标记变量使其同时获得获取和释放内存屏障,但在Java 你不能只要求获取或释放障碍;在 C++0x 中你可以)。

请注意,C++0x 的线程模型是故意低级的,希望人们能在其上构建 TBB 之类的东西,并且下次标准委员会开会时,他们将能够弄清楚哪些更高级别的库和工具包运行良好,可以从中学习。

于 2009-03-13T08:48:12.580 回答
0

无论使用哪种编程语言,线程的特性都很常见。例如,即使跨操作系统,POSIX 线程和 WIN32 线程也具有相同的逻辑特性集,尽管 API 调用和本地实现 WRT 底层硬件/内核可能会发生变化,但对于系统程序员来说,关于线程的逻辑思考以及如何使它们按预期工作& 实现这一点是最困难的部分。在谈到编程语言时甚至是这样。如果您真的了解线程和线程同步的概念,那么您可以在任何您喜欢的编程语言中使用它们。由于这些编程语言在本机线程/线程同步实现之上提供了语法糖。

于 2009-03-13T07:29:28.277 回答