You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否在Semaphore类成员函数中构造接收当前对象的匿名函数?

信号量成员函数中构造特定匿名函数的可行性与风格问题

问题描述

希望在名为Semaphore的类的成员函数中构造一个匿名函数,该函数接受一个Semaphore类型的参数,且传入的对象应为调用acquire()方法的当前对象。请问这是否可行?若可行,是否属于良好编程风格?

参考代码:

void Semaphor::aquire() {
    std::unique_lock<std::mutex> lock(mtx);
    //使用while循环处理虚假唤醒(系统唤醒)
    //while (numOfRessources == 0) {
        //condVar.wait(lock);
    //}
    //是否有办法实现如下操作,使s为当前this对象
    condVar.wait(lock, [](Semaphor s) { return s.isNumOfRessourcesZero(); });
    numOfRessources--;
}

可行性分析

可行,但你当前的写法存在错误,无法达到预期效果:

  • std::condition_variable::wait的谓词lambda不需要接收参数,wait方法不会主动向谓词传递Semaphore对象,所以你写的[](Semaphor s) { ... }会导致编译失败。
  • 要让lambda访问调用acquire()的当前对象,正确的做法是在lambda中捕获this指针,通过指针访问当前对象的成员函数和变量。修正后的代码示例:
condVar.wait(lock, [this]() { return !this->isNumOfRessourcesZero(); });

这里注意:原while循环是等待资源数不为0,所以谓词需要返回true时才停止等待,因此要对isNumOfRessourcesZero()的结果取反,确保逻辑和原while循环一致。

编程风格评价

这种捕获this的写法属于良好的编程风格,原因如下:

  • 相比传统的while循环+wait的写法,带谓词的wait更简洁,能自动处理虚假唤醒,是C++标准库推荐的用法。
  • 捕获this指针可以直接访问当前对象的成员,避免不必要的对象拷贝(如果捕获*this会生成对象拷贝,导致判断的是拷贝对象的资源数,逻辑完全错误)。
  • 注意前提:必须保证当前Semaphore对象在wait期间不会被销毁,否则this指针会变成野指针,引发未定义行为。

内容的提问来源于stack exchange,提问作者Harry

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 01:39:39