Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 创建唯一的线程安全吗 std::数组全局数组; void foo(整数索引) { globalArray[index]=使_唯一(); //或者globalArray[index]=std::unique_ptr p(new SomeClass)? }_C++_Multithreading_C++11_Thread Safety_Unique Ptr - Fatal编程技术网

C++ 创建唯一的线程安全吗 std::数组全局数组; void foo(整数索引) { globalArray[index]=使_唯一(); //或者globalArray[index]=std::unique_ptr p(new SomeClass)? }

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的演讲,其中更详细地介绍了您正在做的事情以及错误共享与此之间的关系。如果两个或多个线程访问同一内存,其中

考虑到这里我确信传递给foo的索引不会重复,也不会超过globalArray的容量,所以不需要检查它,这段代码是线程安全的吗?

如果两个或多个线程访问同一个内存,其中至少有一个访问是写的,那么就存在争用条件。在您的示例中,如果您确定索引是不同的,并且没有两个线程尝试写入相同的内存,那么这是安全的。从不同线程修改同一数组的不同元素是安全的,即使这可能会导致错误



我强烈推荐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); ?
}