能否在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
相关产品推荐
相关产品推荐

