我想推送隊列中的lambda。這個lambda會被強制執行到另一個線程中。而當前線程將等待,直到執行拉姆達,返回一些結果:將lambda推送到C++ STL隊列導致分段錯誤
void * EglThread::execute(const std::function<void *()> f) {
std::condition_variable lambdaExecutedCond;
void * out;
bool exceptionFlag = false;
std::exception exception;
std::unique_lock<std::mutex> lk(this->mutex);
this->queue.push([&]() -> void {
std::unique_lock<std::mutex> __unused lock(this->mutex);
lambdaExecutedCond.notify_one();
try {
out = f();
} catch (const std::exception & e) {
exceptionFlag = true;
exception = e;
}
});
this->cond.notify_all();
lambdaExecutedCond.wait(lk);
if (exceptionFlag) {
throw exception;
} else {
return out;
}
}
void EglThread::run() {
while (true) {
std::unique_lock<std::mutex> lk(this->mutex);
if (this->queue.empty()) {
if (this->flagShutdown) {
break;
} else {
this->cond.wait(lk);
}
} else {
this->queue.front()();
this->queue.pop();
}
}
}
但我push
操作過程中遇到分段錯誤。日誌看起來像:
EglThread::execute().
Queue pushing...
Segmentation fault
而我不知道什麼是錯的。 queue
將對象聲明爲類成員,但不對其構造函數進行明確調用。就像這樣:
std::queue<std::function<void()>> queue;
我不知道爲什麼它失敗了,但是你應該很高興它失敗的那麼早:當你運行它時,lambda實際上不會工作,因爲它通過引用捕獲'mutex'。當你從隊列中運行lambda時,互斥量就會超出範圍。 – dasblinkenlight
根據MCVE構建您的問題肯定會爲您提供答案。我們無法編譯不完整的代碼片段。 https://stackoverflow.com/help/mcve –
@dasblinkenlight爲什麼'互斥'將超出範圍?創建lambda的方法將不會完成,直到lambda被執行。所以所有的局部變量都是「活着的」 –