作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试做这样的事情
#include <iostream>
#include <thread>
#include <chrono>
void doWork(char a, std::stop_token st = {}) {
while (!st.stop_requested()) {
std::cout << a << '\n';
}
}
int main() {
std::jthread t1{doWork, 'A'}, // error
t2{doWork, 'B'}; // error
std::this_thread::sleep_for(std::chrono::milliseconds(50));
}
但它不会在 gcc trunk 上使用 -std=c++2a
进行编译:
/opt/compiler-explorer/gcc-trunk-20200219/include/c++/10.0.1/thread:537:20: error: static assertion failed: std::thread arguments must be invocable after conversion to rvalues
537 | static_assert(is_invocable_v<decay_t<_Callable>,
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
538 | decay_t<_Args>...>,
| ~~~~~~~~~~~~~~~~~~
是否有可能做这样的事情?
我认为这应该是可能的,因为我见过类似的 lambda 示例( here ):
//...
std::jthread t([&ready, &readyMutex, &readyCV] (std::stop_token st) {
while (!stoken.stop_requested()) {
//...
}
});
最佳答案
您的实现几乎是正确的。 constraint on the invokable是它接受 std::stop_token
作为第一个参数。因此,切换 doWork
声明中的顺序即可解决问题。
void doWork(std::stop_token st, char a) {
while (!st.stop_requested()) {
std::cout << a << '\n';
}
}
token 来自库实现,因此它的构造并不意味着让您担心。
关于c++ - 如何在jthread中传递带有参数和stop_condition的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60296573/
我很困惑 std::jthread::get_stop_token旨在工作,因为它似乎具有固有的竞争条件。 即,执行线程不能简单地调用std::jthread本身(如 this example ),因
JVMTI 有一个函数叫做GetAllThreads。但是我们只能得到jthread对象。有什么方法可以获取 jthread 对象的 tid 吗?我所说的 tid 是指由 gettid() 系统调用返
与std::thread相比,它有什么优势? ? 它会否弃用现有的 std::thread ? 最佳答案 std::jthread就像 std::thread ,唯无愚者。见,std::thread如
所以C++20引入了 std::jthread 据我所知,它比 std::thread 更好在各个方面。因此,除了 C++20 的可用性、实现质量、与库的交互等通常的限制之外,... - 是否有任何情
我是一名优秀的程序员,十分优秀!