原来觉得对线程安全是比较了解的,可是今天看了Nokia Developer中的Reentrancy and Thread-safty之后,发现还有有些概念没有很清楚。所以在此留点痕迹好了.
首先两个英文单词: Reentrancy 和 Thread-safty, 我将他们翻译成可重调和线程安全的。
然后又分为函数可重调、函数线程安全和类可重调、类线程安全。
不过基本可以这么认为:
1. 线程安全函数是可重用函数, 可是可重用函数不一定是线程安全的。线程安全函数可以调用共享的数据,而不会出错,但是可重调的只能使用自己私有的数据。
2. reentrant: 只要每一个线程使用不同的这个类的对象,该类的成员函数就可以安全地被多线程调用。
thread-safe:即使不同的线程使用同一个类的对象,该类的成员函数就可以安全地被多线程调用。
如下是它的例子:
reentrant:
class Counter
{
public:
Counter() { n = 0; }
void increment() { ++n; }
void decrement() { --n; }
int value() const { return n; }
private:
int n;
};
Thread-safty:
class Counter
{
public:
Counter() { n = 0; }
void increment() { QMutexLocker locker(&mutex); ++n; }
void decrement() { QMutexLocker locker(&mutex); --n; }
int value() const { QMutexLocker locker(&mutex); return n; }
private:
mutable QMutex mutex;
int n;
};