c++ std::condition_variable::wait_until和wait_for均未在预期等待时间内工作

nuypyhwy  于 2023-03-09  发布在  其他
关注(0)|答案(1)|浏览(298)

我咨询了wait_until example code

#include <iostream>
#include <atomic>
#include <condition_variable>
#include <thread>
#include <chrono>

using namespace std::chrono_literals;

std::condition_variable cv;
//std::mutex cv_m;
std::mutex cv_m[4];
//std::atomic<int> i{ 0 };

void OnRecive(int index/*char* data*/) {
    //ProcessData(data);
    std::thread(
        [index]() {
            std::unique_lock<std::mutex> lk(cv_m[index]);
            //auto now = std::chrono::system_clock::now();
            //if (std::cv_status::timeout == cv.wait_until(lk, now + 5000ms))
            if (std::cv_status::timeout == cv.wait_for(lk, (index+1)*1s))
            {
                cout << "time-out: file transfer failed.\n";
            }
            else
            {
                cout << "no time-out: file transfer continuing.\n";
            }
        }
    ).detach();
}
void main() {
    thread th([]() {
        OnRecive(0);
        OnRecive(1);
        //std::this_thread::sleep_for(100ms);
        OnRecive(2);
        });
    //th.join();

    std::this_thread::sleep_for(5s);
}

在这个例子中,我们期望OnRecive输出所有3个time-out,因为没有cv.notify()来唤醒它们,但是它不起作用,有时候(似乎是随机的),no time-out会被输出。
我正在使用VS 2019 + C17标准。
第一节第一节第一节第一节第一次
我试了wait_until和wait_for,都不起作用。
我也试过使用一个mutex cv_m和多个mutex cv_m[4],也不起作用。你有线索吗?
编辑:
我刚刚用GCC(C
23)的online compiler测试了几次代码:

terminate called without an active exception
time-out: file transfer failed.
time-out: file transfer failed.
time-out: file transfer failed.

它工作得很好!

92vpleto

92vpleto1#

  1. std::thread th必须连接。否则将调用terminate
    1.一个condition_variable与多个mutexes是未定义的行为。
    1.如果您想防止虚假的解块,请添加bool stop_waiting function,如下所示cv.wait_for(lk, (index+1)*1s),[]{return false;})
  2. Detached threads可能会超出您的main运行,因此您将错过结果(例如,如果您运行OnRecive(100))。因此,将OnRecive()放入thread中,而不是将thread放入OnRecive()中,然后在您认为合适时放入jointhreadDetach不是flow control,而只是使thread独立于创建它的object
    1.如果std::thread thjoin的目的以前detached threads它将不起作用,可以删除。

相关问题