所以我有多个线程访问这个函数来检索数据库信息,它是否是线程安全的?
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;
}
代表编辑 - &gt;有时&#39;修复&#39; &GT; &GT;到&gt;&gt;不是一个好主意,但感谢其余的。
答案 0 :(得分:2)
由于results
是一个局部变量,所以它本身在没有锁的情况下是安全的,因为每个线程都会有一个唯一的副本(它在堆栈中,以某种方式动态分配向量的内容)等)。因此,只要您的数据库是线程安全的,您根本不需要任何锁。如果数据库不是线程安全的,那么当然需要保护它。
如在另一个答案中所述,如果由于某种原因,例如创建字符串导致throw bad_alloc;
,则需要处理该问题的影响,并确保锁定已解锁(除非你真的希望把所有其他线程都锁定!)
答案 1 :(得分:1)
一般来说,多个线程可以保存“读”锁。只有一个线程可以保持“写”锁定。当存在“写”锁时,不会保持“读”锁。
这意味着虽然mylock
在query
方法中被锁定,但是没有其他人可以将其锁定为读取或写入,因此它是线程安全的。您可以阅读有关读者 - 作家锁here的更多信息。是否需要锁定那个互斥锁是另一个问题。
但是,代码不是exception-safe。您必须使用RAII才能自动解锁互斥锁,包括堆栈展开。
答案 2 :(得分:0)
它是线程安全的,因为results
是作为局部变量创建的,因此只有一个线程可以在此方法中访问任何结果实例。
如果由于其他原因需要线程安全的向量,请参阅Threadsafe Vector Class for C++上的此答案。