ZThread库在Linux下安装

版权声明 :转载时请以超链接形式标明文章原始出处和作者信息及本声明 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++,这本书不仅提供了一些优秀的多线程库的介绍,更重要的是一些多线程编程思想的介绍和理解,值得一读。

 

你可能感兴趣的:(thread)