繁体   English   中英

C++ 在 for 循环中使用线程

[英]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。

第二个代码在没有数组的情况下执行相同的操作。

访问这样的数组中的线程对象是否存在一些问题?

服务器代码在这里: https://github.com/andyzeng/visual-pushing-grasping/blob/580e2334beec0d83b49e6ca89d7542b79d1d4350/realsense/realsense.cpp#L24

第一个代码未能正确创建 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM