[英]C++ using threads in a for loop
这段代码有什么不同:
std::vector<Server> realsense_server_arr;
for (int i = 0; i < 1; ++i) {
printf("Initializing server... %d\n", i);
Server realsense_server(50000 + i);
realsense_server.init_listener_thread();
realsense_server_arr.emplace_back(realsense_server);
}
int depth_size = aligned_depth.get_width() * aligned_depth.get_height() * aligned_depth.get_bytes_per_pixel();
realsense_server_arr[0].update_buffer((unsigned char*)aligned_depth.get_data(), 10 * 4, depth_size);
int color_size = data.get_color_frame().get_width() * data.get_color_frame().get_height() * data.get_color_frame().get_bytes_per_pixel();
realsense_server_arr[0].update_buffer((unsigned char*)color.get_data(), 10*4 + depth_size, color_size);
// Send camera intrinsics and depth scale
realsense_server_arr[0].update_buffer((unsigned char*)color_intrinsics_arr, 0, 9 * 4);
realsense_server_arr[0].update_buffer((unsigned char*)&depth_scale, 9 * 4, 4);
与此代码相比:
Server realsense_server(50000);
realsense_server.init_listener_thread();
int depth_size = aligned_depth.get_width() * aligned_depth.get_height() * aligned_depth.get_bytes_per_pixel();
realsense_server.update_buffer((unsigned char*)aligned_depth.get_data(), 10 * 4, depth_size);
int color_size = data.get_color_frame().get_width() * data.get_color_frame().get_height() * data.get_color_frame().get_bytes_per_pixel();
realsense_server.update_buffer((unsigned char*)color.get_data(), 10 * 4 + depth_size, color_size);
// Send camera intrinsics and depth scale
realsense_server.update_buffer((unsigned char*)color_intrinsics_arr, 0, 9 * 4);
realsense_server.update_buffer((unsigned char*)&depth_scale, 9 * 4, 4);
它们在功能上是相同的(我认为?)。
第一个代码创建一个数组,添加一个服务器 object,并根据 0 数组索引更新缓冲区。 由于 i<1,数组长度为 1。
第二个代码在没有数组的情况下执行相同的操作。
访问这样的数组中的线程对象是否存在一些问题?
第一个代码未能正确创建 TCP 服务器,它不响应消息并挂起。 第二个代码成功。
前者制作realsense_server
的副本,将该副本放入向量中,然后专门对该副本执行操作。 该副本的 state 可以(并且从外观上看)与复制它的具体 object 有很大不同。 同样重要的是,具体的 object realsense_server
在离开 for 循环迭代时被破坏。
我什至不会开始建议我知道您正在使用的库的第一件事,但我会建议您在这方面会取得更好的成功:
for (int i = 0; i < 1; ++i)
{
printf("Initializing server... %d\n", i);
realsense_server_arr.emplace_back(50000 + i);
realsense_server_arr.last().init_listener_thread();
}
这将在向量尾部就地创建 object,并直接初始化该object 的侦听器线程。 如果i
的限制是已知的并且大于1
(我希望是这样,否则这几乎没有意义),您可能希望首先保留向量容量。 IE,
std::vector<Server> realsense_server_arr;
realsense_server_arr.reserve(n);
for (int i = 0; i < n; ++i)
{
printf("Initializing server... %d\n", i);
realsense_server_arr.emplace_back(50000 + i);
realsense_server_arr.last().init_listener_thread();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.