在第一个线程的 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 秒内)不显示正确的向量大小的主要内容,如果未能解决你的问题,请参考以下文章

Rails Watir:在读取元素文本之前等待 5 秒

条件变量wait_until timeout_time过去了?

sh wait_until.sh

.NET面试题系列(十四)分布式锁

ruby wait_until并等待ajax

iOS中多线程的实现方案