全局数组变量在线程中丢失值
Global array variable loses values in thread
我正在开发一个小应用程序,它首先向定义为全局变量的指针数组添加一些值:
#define MAX_LOCATIONS 32
LocationDTO* locations[MAX_LOCATIONS];
int nLocations = 0;
我使用以下方法将LocationDTO对象引用添加到数组:
bool addLocation(Location *location, string name){
LocationDTO l(name, location);
if(nLocations < MAX_LOCATIONS){
locations[nLocations] = &l;
nLocations++;
return true;
}else{
return false;
}
}
我用这种方式从主方法调用这个函数:
Location l1(1,2);
addLocation(&l1, "one");
Location l2(2,3);
addLocation(&l2, "two");
Location l3(4,5);
addLocation(&l3, "three");
添加完所有值后,我启动一个线程来处理这个数组。线程定义:
void* server_thread(void* args){
// Some code
int i;
for(i=0; i < nLocations; i++){
LocationDTO* l = locations[i];
// More Code
}
}
问题是,在线程的这一点上,locations
中包含的对象不再具有我分配给它们的值。
发生这个问题是因为我在addLocation
内创建对象,然后将引用保存在数组中吗?
我认为这个问题几乎没有可能的解决方案:第一个解决方案:
std::vector<LocationDTO> locations;
const size_t maxSize = 32;
bool addLocation(Location *location, string name)
{
if( locations.size() < maxSize )
{
locations.emplace_back( name, location );
return true;
}
return false;
}
第二种解决方案:
bool addLocation(Location *location, string name){
LocationDTO* l = new LocationDTO(name, location);
if(nLocations < MAX_LOCATIONS){
locations[nLocations] = l;
nLocations++;
return true;
}else{
return false;
}
}
如果您决定使用第二个解决方案,请不要忘记删除所有分配的LocationDTO对象
在addLocation
中,您正在创建一个局部变量l
,并将l
的地址存储在全局数组中。在addLocation
结束时,addLocation
中的任何局部变量在被销毁时都将变为无效。曾经是l
的地址处的存储器可以并且将用于其他数据。您必须使用某种形式的动态内存分配,以允许该位置的内存保持在addLocation
函数的范围之外。
您似乎在堆栈上创建了这些对象,并将指针传递给addLocation()
方法。当您离开作用域(退出函数)时,这些对象将被销毁。启动线程时,你确定这些对象存在吗?
试试这个:
addLocation(new Location(1,2), "one");
addLocation(new Location(2,3), "two");
addLocation(new Location(4,5), "three");
当然,你以后必须销毁这些物体。
问题是,在线程的这一点上,包含在位置中的对象不再具有我分配给它们的值。
您的locations
数组不包含LocationDTO
对象。它包含指向对象的指针。
发生这个问题是因为我在addLocation中创建对象,然后将引用保存在数组中吗?
是的,差不多。更确切地说,您的错误是将locations
中的指针指向一个自动变量。当自动变量超出范围时(在这种情况下是在addLocation
的末尾),并且在此之后指针不再指向有效对象时,它们就会被销毁。引用与指针不同,但这也适用于它们。
避免内存处理错误的最简单方法是让标准库来处理它。我建议您使用std::vector<LocationDTO> locations;
- 我可以计算多线程数的平均值吗?
- 是否可以限制C++17并行"for_each"的线程数
- 设置 JVM 通过 JNI 初始化时创建的线程数
- 如何修复 OpenMP 程序的 gdb 运行中的线程数
- 如何将移动平均线写入数组列表类?
- 使用 C API 更改张量流推理的线程数
- 如何在 OpenMP 中设置线程数
- 最大线程数 - 如何确定C++线程是否并行运行?
- C++的最大线程数
- OpenBLAS 只为一个例程设置线程数
- 关于线程数的奇怪现象
- 在iOS设备上执行并发任务时如何设置正确的线程数?
- OpenMP 并行编程基于线程数与执行时间的关系
- 使用互斥锁将一次运行的线程数限制为 2
- C 读取输入,直到线char数组的结束
- C++ 多线程数组
- 如何放置线程数组的动态大小
- HLSL 获取代码中的线程组和线程数
- C++Boost中的线程数组
- 线程数组并尝试将多个参数传递给函数不起作用