C ++ Vector是否是线程安全的?多线程

时间:2013-06-01 22:36:27

标签: c++ multithreading vector thread-safety

所以我有多个线程访问这个函数来检索数据库信息,它是否是线程安全的?

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;不是一个好主意,但感谢其余的。

3 个答案:

答案 0 :(得分:2)

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

如在另一个答案中所述,如果由于某种原因,例如创建字符串导致throw bad_alloc;,则需要处理该问题的影响,并确保锁定已解锁(除非你真的希望把所有其他线程都锁定!)

答案 1 :(得分:1)

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

这意味着虽然mylockquery方法中被锁定,但是没有其他人可以将其锁定为读取或写入,因此它是线程安全的。您可以阅读有关读者 - 作家锁here的更多信息。是否需要锁定那个互斥锁是另一个问题。

但是,代码不是exception-safe。您必须使用RAII才能自动解锁互斥锁,包括堆栈展开。

答案 2 :(得分:0)

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

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