C++矢量这个线程安全吗?多线程
C++ Vector is this thread-safe? multithreading
所以我有多个线程访问这个函数来检索数据库信息,它是线程安全的吗?
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;
,则需要处理其后果,并确保锁定已解锁(除非您真的希望死锁所有其他线程!(
一般来说,多个线程可以持有"读取"锁。只有一个线程可以持有"写"锁。当存在"写"锁时,可能不会持有"读"锁。
这意味着,当mylock
在query
方法中保持锁定时,其他任何人都不能将其锁定以进行读取或写入,因此它是线程安全的。你可以在这里阅读更多关于读者和作家锁定的信息。是否需要将互斥锁锁定在那里是另一个问题。
然而,该代码并非异常安全。您必须使用RAII来自动解锁互斥,包括在堆栈上展开。
它是线程安全的,因为results
是作为局部变量创建的,所以只有一个线程会访问它——该方法中的任何结果实例。
如果您出于其他原因需要线程安全向量,请参阅C++的线程安全向量类上的答案。
相关文章:
- 全局变量 多读取器 一个写入器多线程安全?
- boost::文件系统::recursive_directory_iterator多线程安全
- 静态 constexpr 类成员变量对多线程读取是否安全?
- 实现在多线程代码中安全恢复的断点
- 为多线程环境包装 c++ new/delete 的安全/好方法
- 是多个线程渲染到单个OpenGL上下文线程安全的线程
- C++多线程:是本地静态lambda线程安全的初始化
- 在多线程程序中使用动态数组的头段安全吗
- C++多线程:线程安全的内存分配
- 如何在不使用的情况下在 <mutex>C++11 中实现多线程安全单例
- 多线程模式下的SQLite3:执行到底不安全
- 为什么映射在C++中不是多线程安全的
- 这是交换(多线程)的异常安全实现吗
- c++多线程-线程安全的代码
- C++矢量这个线程安全吗?多线程
- 对于多线程,shared_ptr销毁是否安全?
- 如何在多线程程序中使用非线程安全库
- 在多线程中安全使用fstream有哪些选项?
- 具有volatile的多线程代码的明显不安全行为的真实示例
- 多线程程序和fork():可选的或安全的实现