在第一个线程的 wait_until(20 秒) 之后,在多个线程中完成的向量 push_backs(20 秒内)不显示正确的向量大小
Posted
技术标签:
【中文标题】在第一个线程的 wait_until(20 秒) 之后,在多个线程中完成的向量 push_backs(20 秒内)不显示正确的向量大小【英文标题】:Vector push_backs done in multiple threads (within 20 sec) don't show correct vector size after wait_until(20 sec) in first thread 【发布时间】:2021-03-16 09:09:50 【问题描述】:基于我正在尝试实现的 boost chat 示例和 wait_until 示例 调用构造函数时向向量(共享对象)添加消息 并且向量的大小应该在等待 20 秒后给出。
当 20 秒内发生 2 次 CreateBlock 调用时,下面会发生什么, 就是第一次调用 CreateBlock 等待 20 秒然后向量的大小为 1, 然后再等待 20 秒,向量大小也为 1。
服务器上的 CreateBlock 调用,从 2 个不同的客户端异步调用:
CreateBlock cb(message_j);
班级:
#include <condition_variable>
#include <thread>
#include <chrono>
#include <vector>
#include "json.hpp"
class CreateBlock
public:
CreateBlock(nlohmann::json &message_j)
std::thread th (&CreateBlock::waits, this, std::ref(message_j));
th.join();
private:
void waits(nlohmann::json &message_j)
std::lock_guard<std::mutex> guard(cv_m);
message_j_vec_.push_back(message_j);
std::cout << "message_j_vec_.size(): " << message_j_vec_.size() << std::endl; // = 1
std::unique_lock<std::mutex> lk(cv_m);
if(cv.wait_for(lk, 20s, [=]return i == 1;))
std::cerr << "Thread finished waiting. i == " << i << '\n';
else
std::cerr << "Thread timed out. i == " << i << '\n';
std::cout << "message_j_vec_.size(): " << message_j_vec_.size() << std::endl; // = 1
private:
std::vector<nlohmann::json> message_j_vec_;
std::condition_variable cv;
std::mutex cv_m;
int i;
;
我确实尝试将向量设为静态,将向量放在单独的类中, 做了 CreateBlock* cb = new CreateBlock(message_j),尝试将 push_back 放入构造函数中,并在另一个方法中创建线程,... 但这些实验都没有达到预期的结果。
知道如何正确解决这个问题吗?
蒂亚。
【问题讨论】:
在它创建的线程终止之前,构造函数不会返回。 创建一个线程并立即加入它很少是正确的做法。 将向量 push_back 放在构造函数中,将线程创建在另一种方法中是解决方案吗? 【参考方案1】:好吧,这里并没有真正的回应,所以我知道我必须以不同于我在这里展示的方式看待问题。因此,我查看了代码的前一步,然后朝着使用静态变量的解决方案努力。 我终于成功地在我想要的地方找到了正确的尺寸。
感谢您保持沉默,为我指明了正确的方向!不是传统的方式,但它有效。不过,我度过了愉快的一周!
【讨论】:
以上是关于在第一个线程的 wait_until(20 秒) 之后,在多个线程中完成的向量 push_backs(20 秒内)不显示正确的向量大小的主要内容,如果未能解决你的问题,请参考以下文章