- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我现在什么都不懂。假设我有下一段代码(简化版):
#include <iostream>
#include <thread>
#include <condition_variable>
#include <mutex>
#include <chrono>
const auto k_sleep = std::chrono::seconds{3};
const auto k_wait = std::chrono::seconds{1};
const auto k_repeats = 20u;
void test()
{
std::mutex m;
std::condition_variable c;
bool processed = false;
std::thread worker{[&]() {
std::this_thread::sleep_for(k_sleep);
std::unique_lock<std::mutex> lock(m);
processed = true;
lock.unlock();
c.notify_one();
}};
std::unique_lock<std::mutex> lock(m);
if(c.wait_for(lock, k_wait, [&processed]() {
return processed;
}))
{
worker.join();
std::cout << "done" << std::endl;
}
else
{
worker.detach();
std::cout << "timeout" << std::endl;
}
}
int main()
{
for(auto i = 0u; i < k_repeats; ++i)
test();
}
几个问题:
condition_variable
(以及与 thread
相关的所有其他内容)?timeout
会打印多少次?如您所见,我正在运行线程并等待它(使用 condition_variable
)一段时间。等待时间小于线程的执行时间。
同时使用 VC++(Visual Studio 2015,v 19.00.23026)和 g++(v 4.8.2)我打印了 timeout
2 次,然后我卡在了 worker.join ()
在调试器下。如果我将 k_sleep
增加到一些大的东西(相对于 k_wait
小循环计数),例如,30 秒 - 一切都会好起来的。
那么,为什么会这样?如果我做错了什么,请向我解释正确的方法。谢谢
最佳答案
你的内存管理有问题:
m
、c
和processed
)都分配在堆栈上,当您分离 a 时它们将超出范围工作线程。所以,当线程醒来时,它会访问垃圾。因此,您需要在堆上分配数据并确保不通过引用捕获变量。我总是喜欢将数据显式传递到 std::thread
。
#include <iostream>
#include <thread>
#include <condition_variable>
#include <mutex>
#include <chrono>
#include <memory>
const auto k_sleep = std::chrono::seconds{ 3 };
const auto k_wait = std::chrono::seconds{ 1 };
const auto k_repeats = 20u;
struct Data
{
std::mutex m;
std::condition_variable c;
bool processed = false;
};
void test()
{
auto data = std::make_shared<Data>();
auto run = [](std::shared_ptr<Data> i_data) {
std::this_thread::sleep_for(k_sleep);
std::unique_lock<std::mutex> lock(i_data->m);
i_data->processed = true;
lock.unlock();
i_data->c.notify_one();
};
std::thread worker{ run, data };
std::unique_lock<std::mutex> lock(data->m);
if (data->c.wait_for(lock, k_wait, [&data]() {
return data->processed;
}))
{
worker.join();
std::cout << "done" << std::endl;
}
else
{
worker.detach();
std::cout << "timeout" << std::endl;
}
}
int main()
{
for (auto i = 0u; i < k_repeats; ++i)
test();
}
关于c++ - 等待线程超时 : freeze,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32536966/
嗨,任何人都可以告诉如何卡住 gridview 标题和基于轴的一些两列,因此 gridview 应该同时具有垂直和水平滚动,以便在垂直滚动时需要卡住标题,在水平滚动时卡住列。 最佳答案 嘿,我找到了一
我不小心在 venv 之外安装了 jupyter 及其所有依赖包。我正在尝试手动删除它们,但还有很多其他包(command-not-found、systemd-python、ubuntu-driver
Object.freeze() Object.freeze() 方法可以冻结一个对象。一个被冻结的对象再也不能被修改;冻结了一个对象则不能向这个对象添加新的属性,不能删除已有属性,不能修改该对象已
我一直在the tutorials上如何进行简单的音频识别。 首先,我输入时遇到错误 python tensorflow/examples/speech_commands/freeze.py 说 py
Closed. This question is opinion-based 。它目前不接受答案。 想改善这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答。 3年
我想写一个简单的网络代理,作为练习。这是我到目前为止的代码: def g = new Proxy() g.serverPort = 9000 println "starting" g.eachClie
我是 Java 新手,它不是我的第一种编程语言。我实际上尝试编写一个下载器来下载所有文件,直到服务器上的版本与客户端版本相同。 程序运行良好,但这是我无法解决的问题。 如果我运行这段代码: priva
我注意到当我在录制过程中暂停并恢复8次或更多次时,AVAudioRecorder(iOS)会挂起。在模拟器上,它无限期地挂起,在设备上,我得到以下错误: AudioQueueStop发布消息以杀死me
我正在为使用我的 lib 的 C 程序编写一个调试器应用程序。调试器获取应用程序名称并运行它( fork )。 我将调试消息从应用程序发送到我的调试器(每次它在库中输入一些函数时)。我需要能够通过调试
当我们从 Windows 迁移到 Linux 时,我们的 Nightwatch 测试不再运行。它只是卡住。 Selenium 服务器已在监听,并且 chrome_driver(linux 64 位)设
我的脚本使用 sqlalchemy 连接到 MySQL 数据库 from sqlalchemy import * engine = create_engine("mysql+mysqlconnecto
我正在寻找一种“卡住”页面的方法,这样我就可以检查出现的元素,例如当我将鼠标悬停在某个字段时。 我知道这里的答案:Firebug: How to inspect elements changing w
假设,我有一个 MenuBar,其中有几个 MenuItem。每个 MenuItem 负责打开不同的 Stage 窗口。当应用程序正在消化新 Stage 的代码时,如何避免单击上述 MenuItem
我有一个 元素。在某些时候,我不希望它再接受文本。出于某种原因,更改 type至 type="button"例如不允许。 如何制作我的 元素不再接受文本? 最佳答案 设为只读: $('#myInput
我现在什么都不懂。假设我有下一段代码(简化版): #include #include #include #include #include const auto k_sleep = std:
我想知道是否有一种方法可以“卡住”输入行,以便在 c 中将输入和输出彼此分开。例如,我的控制台输出目前是这样的: 1 OutputLine1 2 OutputLine2 但我希望它是这样的: 1 Ou
试试这个: int main() { std::fstream fin_fout("some.txt"); std::istream_iterator beg(fin_fout),en
我正在尝试重写 xCmd,它可以在远程机器上启动进程。基本上,它将自身作为服务安装在目标计算机上,然后启动请求的进程。一切正常,但我注意到一个错误。 xCmd 通过管道进行通信,它使用 WriteFi
鲁比的 standard uri library在无法修改或修改不会造成伤害的对象上卡住有很多用途: user, password = ui.split(':'.freeze, 2) #
我正在尝试用 Javascript 创建一个枚举。使用的javascript代码是 var FeatureName = { "FEATURE1": 1, "FEATURE2": 2, "FEATURE
我是一名优秀的程序员,十分优秀!