1

So i have multiple threads accessing this function to retrieve database information, is it thread safe?

vector<vector<string> > Database::query(const char* query)
{
    pthread_rwlock_wrlock(&mylock); //Write-lock
    ...
    vector<vector<string> > results;
    results.push...
    pthread_rwlock_unlock(&mylock); //Write-lock

    return results;
}

for editors -> sometimes 'fixing' > > to >> is not a good idea but thanks for the rest.

4

3 回答 3

2

由于results是一个局部变量,它本身在没有锁的情况下使用是安全的,因为每个线程都会有一个唯一的副本(它在堆栈上,向量的内容以某种方式动态分配,等等)。因此,只要您的数据库是线程安全的,您就根本不需要任何锁。如果数据库不是线程安全的,你当然需要保护它。

如另一个答案中所述,如果由于某种原因,例如创建字符串导致 a throw bad_alloc;,您需要处理其后果,并确保锁已解锁(除非您真的希望死锁所有其他线程!)

于 2013-06-01T22:43:17.797 回答
1

一般来说,多个线程可以持有“读”锁。只有一个线程可以持有“写”锁。当存在“写”锁时,可能不会持有“读”锁。

这意味着虽然 mylock被锁定在query方法内部,但没有其他人可以锁定它以进行读取或写入,因此它是线程安全的。您可以在此处阅读有关读写器锁的更多信息。您是否需要将互斥锁锁定在那里是另一个问题。

但是,该代码不是异常安全的。您必须使用RAII才能自动解锁互斥锁,包括堆栈展开。

于 2013-06-01T22:43:08.990 回答
0

它是线程安全的,因为它是results作为局部变量创建的,因此只有一个线程会访问此方法中的任何结果实例。

如果您出于其他原因需要线程安全向量,请参阅Threadsafe Vector Class for C++上的此答案。

于 2013-06-01T22:48:16.047 回答