具体来说,如果在常量成员函数中,在开头使用
mutex.lock()
,并在返回前使用mutex.unlock()
,则在OpenMP循环内运行时会导致崩溃。但是,如果将这两个调用替换为一个QMutexLocker(&mutex)
,则可以平稳运行。
Visual Studio 2010,Qt 4.8。
我希望这两个代码等效,但显然它们不是。我在这里错过了什么?
编辑:
虽然这不能复制问题,以下是一个小例子:class TileCache
{
public:
bool fillBuffer(const std::string& name) const {
//QMutexLocker lock(&mCacheMutex);
mCacheMutex.lock();
auto ite = mCache.find(name);
if(ite == mCache.end())
mCache.insert(ite, std::make_pair(name, new unsigned char[1024]));
// code here
mCacheMutex.unlock();
return true;
}
private:
mutable std::map<std::string, unsigned char*> mCache;
mutable QMutex mCacheMutex;
};
int main(int argc, char *argv[])
{
std::cout << "Test" << std::endl;
TileCache cache;
#pragma omp parallel for shared(cache)
for(int i = 0; i < 2048; ++i)
{
cache.fillBuffer("my buffer");
}
return 0;
}
我基本上是在问,如果总是调用lock()
/unlock()
(没有unlock()
调用不匹配的lock()
),是否有任何已知的理由认为这两种方式不等效于QMutexLocker
,在某些情况下可能会表现出不同行为。