#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(C23)的online compiler测试了几次代码:
terminate called without an active exception
time-out: file transfer failed.
time-out: file transfer failed.
time-out: file transfer failed.
它工作得很好!
1条答案
按热度按时间92vpleto1#
std::thread th
必须连接。否则将调用terminate
。1.一个
condition_variable
与多个mutexes
是未定义的行为。1.如果您想防止虚假的解块,请添加
bool stop_waiting function
,如下所示cv.wait_for(lk, (index+1)*1s),[]{return false;})
。Detached threads
可能会超出您的main运行,因此您将错过结果(例如,如果您运行OnRecive(100)
)。因此,将OnRecive()
放入thread
中,而不是将thread
放入OnRecive()
中,然后在您认为合适时放入join
thread
。Detach
不是flow control
,而只是使thread
独立于创建它的object
。1.如果
std::thread th
到join
的目的以前detached threads
它将不起作用,可以删除。