我正在寻找一个开发工作,看到许多列表指出开发人员必须精通多线程。这既出现在Java作业列表中,也出现在UNIX上涉及“系统编程”的C ++列表中。
在过去的几年里,我一直在使用Java并使用其各种同步机制。
在90年代末期,我做了很多C ++工作,虽然线程非常少。然而,在大学里,我们在Solaris上使用了线程。
我的问题是,与Java开发人员相比,C / C ++开发人员面临的问题是否存在显着差异,以及解决这些问题的任何技术是否存在根本不同。 Java显然包括一些更好的机制和集合的同步版本等。
如果我想在UNIX上刷新或重新学习线程,最好的方法是什么?我应该看哪个图书馆?在c ++中是否有一些关于线程的最新教程?
答案 0 :(得分:7)
线程的基本挑战(例如同步,竞争条件,线程间通信,资源清理),但Java使得线程更易于管理,包括垃圾收集,异常,高级同步对象,带反射的高级调试支持。
使用C ++,您更容易出现内存损坏和“不可能”的竞争条件。而且你需要编写更多的低级线程原语,或者依赖不属于标准化语言的库(如boost)。
答案 1 :(得分:4)
C ++实际上比Java编写复杂的线程代码更为有趣,因为它具有Java缺少的功能 - RAII或“资源获取是初始化”。这个成语用于编写良好的C ++代码中的所有资源控制,但特别适用于必须自动管理同步的多线程代码。
答案 2 :(得分:3)
垃圾收集使编程线程不会更容易泄漏内存,并且可以fancy things来解决收集的时间问题。
确定性析构函数使编程线程不会更容易产生僵尸,请参阅ACM论文here
答案 3 :(得分:3)
看看pthreads和boost(pthreads,其中一个是随机的lijnk,但它看起来还不错)。
在高层次上,Java / C / C ++ /的问题是相同的。关于如何解决问题(调用函数,创建类等等)的细节因语言而异。
答案 4 :(得分:1)
这取决于您选择的工作级别。英特尔TBB和OpenMP处理了很多常见的案例。 Posix线程,Windows API和可移植库(如Boost线程)使您更接近与Java中的基元相同的级别。
C ++ 0x线程(尤其是获取和释放内存障碍)允许您进入更低级别以获得比Java提供的更多控制和复杂性(在Java中标记变量volatile
使其成为获取和一个释放内存屏障,但在Java中你不能只要求获取或只是释放障碍;你可以在C ++ 0x中。)
请注意,C ++ 0x的线程模型是故意低级别的,希望人们能够在它之上构建TBB之类的东西,并且下次标准委员会会面时他们将能够找出哪些更高级别级别库和工具包可以很好地学习。
答案 5 :(得分:0)
无论使用何种编程语言,线程的特性都很常见。例如,甚至跨OS,POSIX线程& WIN32线程具有相同的逻辑特性集,尽管API调用&本机实现WRT底层硬件/内核可能会改变,但对于系统程序员来说,关于线程和逻辑的逻辑思考。如何使它们按预期工作&实现这一目标是最困难的部分。在使用编程语言时甚至都是如此。如果你真的了解线程和概念的概念线程同步你很高兴&以您喜欢的任何编程语言使用它们。由于这些编程语言在本机线程/线程同步实现之上提供了语法糖。