版权声明 :转载时请以超链接形式标明文章原始出处和作者信息及本声明 http://linuxmem.blogbus.com/logs/47311596.html
ZThread 是 一个优秀的开放源码的C++线程库,Bruce Eckel在Thinking in C++第二卷的第11章讲述C++并发编程的时候即以此为基础。ZThread库在使用的时候与Java多线程编程很相似,对于有Java多线程编程经验 的程序员来说也非常容易上手:)
下载地址:http://zthread.sourceforge.net/download.html
当前ZThread版本为2.3.2,下载之后解压,按照configure-make-make install的“三部曲”编译安装,出现问题。
问题提示:
g++ -DHAVE_CONFIG_H -I. -I. -I. -I../include -g -O2 -Wall -DNDEBUG -g -O2 -Wall -DNDEBUG -MT AtomicCount.lo -MD -MP -MF .deps/AtomicCount.Tpo -c AtomicCount.cxx -fPIC -DPIC -o .libs/AtomicCount.o
In file included from vanilla/SimpleAtomicCount.cxx:26,
from AtomicCount.cxx:55:
../include/zthread/Guard.h: In destructor `ZThread::Guard<LockType, LockingPolicy>::~Guard()':
../include/zthread/Guard.h:494: error: there are no arguments to `isDisabled' that depend on a template parameter, so a declaration of `isDisabled' must be available
../include/zthread/Guard.h:494: error: (if you use `-fpermissive', G++ will accept your code, but allowing the use of an undeclared name is deprecated)
以下解决办法转载自:http://bbs.chinaunix.net/viewthread.php?tid=928981 ,感谢coldwarm网友!
=============================================================
这个是编译器编译器版本的问题.印象里Zthread的作者已经停止开发一段时间了.
g++3.4以后版本的名字查找方法和以前的版本不同,问题这里有解释.http://gcc.gnu.org/onlinedocs/gcc/Name-lookup.html .
实际上解决方法编译结果已经说了.
一种是使用-fpermissive开关来允许老的语法,
用export CXXFLAGS=-fpermissive,然后在configure
另一种方法可以在调用函数时加this.
this->isDisabled()
还可以把isDisabled()在那个类头部分重新声明一下.
using BaseClass<T>::isDisabled();
=============================================================
我使用第一种方法安装成功之后,修改已经安装好的头文件zthread/Guard.h:(注意,是已经拷贝到安装目录的那个,同时也是以后写程序 要include的那个,而不是源代码里面那个)第494行, 就是上面提到的第2步, 如果不做, 以后调用Guard.h还是会出错的。
搞定之后,写个程序测试一下:)
=============================================================
1 #include <iostream>
2 #include <string>
3 #include <zthread/Thread.h>
4 #include <zthread/Runnable.h>
5
6 using namespace std;
7 using namespace ZThread;
8
9 class Counter : public Runnable {
10 int _count;
11 int _id;
12 public:
13 Counter(int count, int id = 0) :
14 _count(count), _id(id) {}
15 ~Counter() {
16 cout << "Counter " << _id << " completed!" << endl;
17 }
18 void run() {
19 try {
20 while (_count--) {
21 cout << "Counter " << _id << ": " << _count << endl;
22 Thread::sleep(10);
23 }
24 cout << "Counter " << _id << ": end" << endl;
25 } catch (Interrupted_Exception& e) {
26 cerr << e.what() << endl;
27 }
28 }
29 };
30
31 int main() {
32 const int n = 5;
33 try {
34 for (int i = 0; i < n; i++) {
35 Thread t(new Counter(10, i));
36 }
37 } catch (Synchronization_Exception& e) {
38 cerr << e.what() << endl;
39 }
40 }
=============================================================
编译应该没问题,运行的时候可能会有错误:error while loading shared libraries: libZThread-2.3.so.2: cannot open shared object file: No such file or directory
把 libZThread-2.3.so.2 cp 到/usr/lib目录应该就可以运行了。
运行结果如下:
=============================================================
Counter 0: 9
Counter 1: 9
Counter 2: 9
Counter 1: 8
Counter 0: 8
Counter 3: 9
Counter 4: 9
Counter 0: 7
Counter 2: 8
Counter 3: 8
Counter 1: 7
Counter 4: 8
Counter 2: 7
Counter 0: 6
Counter 3: 7
Counter 1: 6
Counter 4: 7
Counter 0: 5
Counter 2: 6
Counter 3: 6
Counter 1: 5
Counter 4: 6
Counter 2: 5
Counter 0: 4
Counter 3: 5
Counter 1: 4
Counter 4: 5
Counter 0: 3
Counter 2: 4
Counter 3: 4
Counter 1: 3
Counter 4: 4
Counter 2: 3
Counter 0: 2
Counter 1: 2
Counter 3: 3
Counter 4: 3
Counter 1: 1
Counter 3: 2
Counter 0: 1
Counter 2: 2
Counter 4: 2
Counter 0: 0
Counter 2: 1
Counter 3: 1
Counter 1: 0
Counter 4: 1
Counter 0: end
Counter 0 completed!
Counter 1: end
Counter 1 completed!
Counter 4: 0
Counter 2: 0
Counter 3: 0
Counter 2: end
Counter 2 completed!
Counter 3: end
Counter 3 completed!
Counter 4: end
Counter 4 completed!
=============================================================
运行的结果不一定跟上面的结果完全一致,这正是多线程程序的特点:)
对于ZThread库和多线程编程的入门级介绍,请参阅Thinking in C++第二卷,如果已经对此熟练掌握,可以看看Parallel and Distributed Programming Using C++,这本书不仅提供了一些优秀的多线程库的介绍,更重要的是一些多线程编程思想的介绍和理解,值得一读。