- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
用C++编程,可能我的脑子还停留在90年代,有些概念绕不开请帮帮我。
使用 gtkmm 进行开发也是如此,遇到了一些多线程示例,如下所示
class ExampleWorker {
public:
void do_work(ExampleWindow* caller);
private:
mutable std::mutex m_Mutex;
};
ExampleWindow::ExampleWindow(){
ExampleWorker m_Worker;
std::thread* m_WorkerThread;
void ExampleWindow::on_start_button_clicked() {
if (blablabla){
blablabla
} else {
// Start a new worker thread.
m_WorkerThread = new std::thread(/////////////lambda function
[this] // <==== let this this be "this-A"
{
m_Worker.do_work(this); // let this this be "this-B"
}///////////////end of lambda function /////////////
);
}
我无法理解的主要是 lambda 部分。所以首先 lambda 概念对我来说很新,正在查找 C++ 中“捕获”的概念但没有找到太多,所以我最好的猜测是,在这种情况下,它允许我“捕获”“根据文档,返回的 [this]"似乎是 [this] 按值捕获 this 指针
,指向 worker 的指针被转换为线程指针,因为 worker 包含互斥锁。
但是我不明白的是,对我来说,“this-B”似乎表明“this”正在将 ExampleWindow 对象本身传递给函数,正如它应该传递的 Worker 类所定义的那样它的调用者进入它;而“this-A”似乎能够指代工作线程本身。问题,这是否意味着 lambda 函数捕获 [this] 在这种情况下取代了正常的“this”,后者指的是“this-B”中的调用对象?
关于 lambda 的更多信息,另一个我一直难以理解的例子来自 boost asio。
//definition
void async_read_some(
const MutableBufferSequence & buffers,
ReadHandler handler);
// async_tcp_echo_server.cpp
class session : public std::enable_shared_from_this<session>{
private:
void do_read()
{
auto self(shared_from_this());
socket_.async_read_some(boost::asio::buffer(data_, max_length),
[this, self](boost::system::error_code ec, std::size_t length) //<===this is where it is very troubling
{
if (!ec)
{
do_write(length);
}
});
}
那么假设该部分是一个处理程序,为什么是它,或者它是 2 个函数?它会同时调用 this->do_write 和 self->do_write 吗?它们有何不同?在这种情况下,[this, self]/[this]/[self] 之间到底有什么区别?是第一个 this/self 被执行了吗?
关于 lambda 的更多信息,它只是一种简化了 pre c++11 中某些内容的语法吗?有什么等价的 pre c++11 吗?或者它是否提供了一些新功能,例如在函数中访问一些以前无法访问的变量?抱歉,这似乎微不足道,但我想我通读了文档和其他一些在线文章并尝试了但仍然未能掌握整个概念。
最佳答案
对我来说,最初理解 lambda 对我这样看待它们很有帮助。
struct <closure>
{
<something> operator()(<params>) const { ... <function>; }
<init-capture-as-members>
};
所以
[someInt](double a, double b) { return 5; }
struct <closure>
{
int operator()(double a, double b) const { return 5; }
int someInt;
};
捕获列表中的所有内容都像“成员”,当您执行 lambda 时,您调用 operator()
它更复杂(甚至有 const 和 mutable 等)但它只是一个简单的抽象。
现在针对您的具体问题:
this
是指向您所在对象的指针。因此它不是指向 std::thread
的指针反对但反对 ExampleWindow
对象。
this
在捕获列表中也有一种特例。当您添加 [this]
在捕获列表中,您“允许”lambda 调用当前对象的所有内容。它还允许您在不使用 this->
的情况下使用成员函数。虽然作为前缀。
所以你的电话do_write(...)
可以看作是this->do_write(...)
self
只是一个共享指针,所以它将像其他所有捕获的对象一样对待。您必须显式调用 self->...
对它做任何事情。我假设这在 init-capture 中是必需的,因此只要线程运行,对象就会保持事件状态。仅使用 this
在 init-capture 中不会增加引用计数,因此您可能会在调用 do_write
时意外删除该对象没有它。
关于c++11 - c++ lambda 捕获这个概念,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39996625/
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题? Update the question所以它是on-topic对于堆栈溢出。 10年前关闭。 Improve this qu
我正在开发一个 Android 应用程序。在此应用程序中, Logo 栏显示在所有页面( Activity )上,或者我们可以说它在所有页面上都有标题。这个 Logo 栏有几个图标,如主页、登录、通知
我正在使用 hadoop 使用开源接口(interface) HVPI 处理视频。然而,inputsplit 的实现,更准确地说是在 isSplitableobContext (context, Pa
1. 是什么? MySQL 是最流行的关系型数据库管理系统,在 WEB 应用方面 MySQL 是最好的 RDBMS(Relational Database Management System
有没有办法使用 c++20s 的概念来检查一个值是否满足某些要求? 假设我正在编写某种使用分页的容器,并且我想让页面大小成为模板参数。 template class container; 我可以使用带
如何在 ArrayList 中循环遍历 ArrayList? 例如,如果我有一个名为 Plants of Plant 对象的 ArrayList。每个 Plant 对象内部都有一个随机数量的花名。我如
如何在UML类图中绘制C++概念? 具体来说,我有以下代码: template concept Printable = requires(T a, std::ostream &where) {
我有兴趣制作一个网站,在访问者访问时闪现整个网络历史记录。我计划使用 JavaScript 来获取每个观看者计算机上的历史记录,并根据他们拥有的内容以不同的速度对其进行动画处理。我的想法是使用 his
有一个模板定义,例如: template void foo( void ) { /* ... */ } 如何定义一个概念,以便N必须为非零正值(N> = 1)? 就像是: template con
封装是信息隐藏还是导致信息隐藏? 正如我们所说,封装将数据和函数绑定(bind)在单个实体中,因此它为我们提供了对数据流的控制,并且我们只能通过一些定义良好的函数来访问实体的数据。因此,当我们说封装导
下面有一个简单的代码片段,它使用以下方式进行编译: g++-9 -std=c++2a -fconcepts 这是试图定义一个需要存在函数的概念。我希望输出是"is",但事实并非如此……知道为什么吗?谢
我有一个普通二元运算符的概念 template concept is_binary_operation = requires (const T& t1, const T& t2) // e.g
我正在c++ 20中实现具有启发式功能的搜索算法。 我试图用类似这样的概念来约束我的算法可以使用的功能: template concept Heuristic = requires(SelfType
我需要了解 SAS 如何读取/执行数据步骤。当我查找有关 SAS 如何读取数据步骤的信息时,我似乎只找到有关它如何读取以进行合并的信息,我不了解与常规数据步骤相关的信息。比方说,我有这行代码: dat
最近我看到一个关于“框架”的问题,如果“框架”有不同的类型或概念。那么,存在不同“类型”的“框架”吗? 例如:NodeJS 是一种“类型”(概念),而 Hibernate ORM 是另一种“类型”(概
如何使用任何技术禁用或清除客户端浏览器 Cookie 我认为使用 javascript 可以用于任何技术 最佳答案 var cookies = document.cookie.split(";");
我正在使用 target = "_blank" 单击链接时生成新选项卡。但是,浏览器会将焦点移至该选项卡。 有没有办法让焦点保持在当前标签页上? 回答摘要 基本上,只需发送一个模拟控件点击的当前事件。
我正在尝试在我的 android/firebase(cloud firestore) 应用程序上添加一项需要其他用户批准/拒绝的功能。例如,当 Air&BnB 上的用户想要预订一个地方时,所有者必须批
这个问题在这里已经有了答案: mysql_fetch_array()/mysql_fetch_assoc()/mysql_fetch_row()/mysql_num_rows etc... expec
public class MyClass { public static void main(String[] args) { System.out.println("Hell
我是一名优秀的程序员,十分优秀!