【发布时间】:2015-10-09 06:27:46
【问题描述】:
我将从一个例子开始。假设我需要使用互斥锁中的函数来保护代码。有两种实现方式。
#include <iostream>
#include <vector>
#include <pthread.h>
pthread_mutex_t myMutex = PTHREAD_MUTEX_INITIALIZER;
std::vector<float> myVec;
void threadfunc(int i, float value)
{
pthread_mutex_lock(&myMutex);
if(i <= 0 || i > myVec.size())
{
pthread_mutex_unlock(&myMutex);
return;
}
if(value < 0)
{
pthread_mutex_unlock(&myMutex);
return;
}
myVec[i] += value;
pthread_mutex_unlock(&myMutex);
return;
}
class AUTOMUTEX
{
private:
pthread_mutex_t *mMutex;
public:
AUTOMUTEX(pthread_mutex_t *mutex): mMutex(mutex)
{
pthread_mutex_lock(mMutex);
}
~AUTOMUTEX()
{
pthread_mutex_unlock(mMutex);
}
};
void threadfunc_autolock(int i, float value)
{
AUTOMUTEX autoMutex(&myMutex);
if(i <= 0 || i > myVec.size())
{
return;
}
if(value < 0)
{
return;
}
myVec[i] += value;
return;
}
int main()
{
threadfunc_autolock(5, 10);
threadfunc(0, 7);
return 1;
}
从示例中可以清楚地看出,threadfunc autolock 是更好的实现,因为调用 pthread_mutex_unlock 函数返回由对 AUTOMUTEX 的析构函数调用来处理(C++ 11 线程支持这一点。因此,如果我们不需要我们自己的 AUTOMUTEX 实现正在使用 C++11 线程库)。 每次我们需要使用一些设置/重置函数对来执行此操作时,有没有一种方法可以在不实现包装类的情况下实现这一点。 boost 或 C++ 11 是否有一些预定义的模板类,我们可以使用它为任何此类“设置/重置”类型的函数实现 AUTOMUTEX 的行为。这对于具有多个返回点的函数非常有用。 换句话说,boost/C++ 是否提供了具有以下行为的类。
//sample code not compilable.
template <class T, class Y>
class myAuto
{
myAuto()
{
T();
}
~myAuto()
{
Y();
};
【问题讨论】:
-
您是专门寻找互斥锁/解锁机制,还是在进入和退出时对两个不相关函数的通用调用?
-
Boost thread library 已经有很长时间的作用域锁了。