C++矢量这个线程安全吗?多线程

C++ Vector is this thread-safe? multithreading

本文关键字:安全 多线程 线程 C++      更新时间:2023-10-16

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

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;
}

对于编辑器->来说,有时将>>"修复"为>>不是一个好主意,但感谢其余部分。

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

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

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

这意味着,当mylockquery方法中保持锁定时,其他任何人都不能将其锁定以进行读取或写入,因此它是线程安全的。你可以在这里阅读更多关于读者和作家锁定的信息。是否需要将互斥锁锁定在那里是另一个问题。

然而,该代码并非异常安全。您必须使用RAII来自动解锁互斥,包括在堆栈上展开。

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

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