C++ 创建唯一的线程安全吗 std::数组全局数组; void foo(整数索引) { globalArray[index]=使_唯一(); //或者globalArray[index]=std::unique_ptr p(new SomeClass)? }
考虑到这里我确信传递给foo的索引不会重复,也不会超过globalArray的容量,所以不需要检查它,这段代码是线程安全的吗?如果两个或多个线程访问同一个内存,其中至少有一个访问是写的,那么就存在争用条件。在您的示例中,如果您确定索引是不同的,并且没有两个线程尝试写入相同的内存,那么这是安全的。从不同线程修改同一数组的不同元素是安全的,即使这可能会导致错误C++ 创建唯一的线程安全吗 std::数组全局数组; void foo(整数索引) { globalArray[index]=使_唯一(); //或者globalArray[index]=std::unique_ptr p(new SomeClass)? },c++,multithreading,c++11,thread-safety,unique-ptr,C++,Multithreading,C++11,Thread Safety,Unique Ptr,考虑到这里我确信传递给foo的索引不会重复,也不会超过globalArray的容量,所以不需要检查它,这段代码是线程安全的吗?如果两个或多个线程访问同一个内存,其中至少有一个访问是写的,那么就存在争用条件。在您的示例中,如果您确定索引是不同的,并且没有两个线程尝试写入相同的内存,那么这是安全的。从不同线程修改同一数组的不同元素是安全的,即使这可能会导致错误 我强烈推荐Scott Meyers的演讲,其中更详细地介绍了您正在做的事情以及错误共享与此之间的关系。如果两个或多个线程访问同一内存,其中
我强烈推荐Scott Meyers的演讲,其中更详细地介绍了您正在做的事情以及错误共享与此之间的关系。如果两个或多个线程访问同一内存,其中至少有一个访问是写入的,则您存在争用条件。在您的示例中,如果您确定索引是不同的,并且没有两个线程尝试写入相同的内存,那么这是安全的。从不同线程修改同一数组的不同元素是安全的,即使这可能会导致错误
我强烈推荐Scott Meyers的演讲,该演讲更详细地讲述了你到底在做什么,以及虚假分享与此有何关系 创建唯一的线程安全吗 从指针创建
std::unique_ptr
是线程安全的。此外,访问数组的唯一索引是线程安全的
尽管构造函数通常是线程安全的,但是如果不知道它的定义,我们就无法知道SomeClass
的默认构造函数是否安全
此外,稍后从其他线程访问创建的指针将需要同步
请注意,如果从单独的线程写入指针数组的相邻索引,则错误共享可能会妨碍性能
创建唯一的线程安全吗
从指针创建std::unique_ptr
是线程安全的。此外,访问数组的唯一索引是线程安全的
尽管构造函数通常是线程安全的,但是如果不知道它的定义,我们就无法知道SomeClass
的默认构造函数是否安全
此外,稍后从其他线程访问创建的指针将需要同步
请注意,如果从单独的线程写入指针数组的相邻索引,则错误共享可能会妨碍性能。是否
SomeClass
访问某个全局/并发变量?这是否回答了您的问题?创建任何对象都是“线程安全的”,因为一次不能由多个线程创建单个对象。但是如果你把它的地址附加到一个指针上,只有一个线程一次可以访问那个指针。你需要考虑整个图片。我想在某个地方,您也在访问分配给数组中元素的唯一指针。当然,这些访问必须与创建元素同步阅读更多:是否SomeClass
访问一些全局/并发变量?这是否回答了您的问题?创建任何对象都是“线程安全的”,因为一次不能由多个线程创建单个对象。但是如果你把它的地址附加到一个指针上,只有一个线程一次可以访问那个指针。你需要考虑整个图片。我想在某个地方,您也在访问分配给数组中元素的唯一指针。当然,这些访问必须与创建元素同步读取更多:
std::array<unique_ptr<SomeClass>, 1000> globalArray;
void foo(int index)
{
globalArray[index] = make_unique<SomeClass>();
//or globalArray[index] = std::unique_ptr<SomeClass> p(new SomeClass); ?
}