Multithreading 线程C+中等待中的谓词函数出现问题+;

Multithreading 线程C+中等待中的谓词函数出现问题+;,multithreading,c++11,mutex,wait,condition-variable,Multithreading,C++11,Mutex,Wait,Condition Variable,我试图将条件放入函数中,但它抛出了令人困惑的编译时错误。而如果我在lambda函数中像这样写[]{retur I==k;},它显示k是未知的。谁能告诉我怎么解决这个问题吗 #include <iostream> #include <mutex> #include <sstream> #include <thread> #include <chrono> #include <condition_variable> using

我试图将条件放入函数中,但它抛出了令人困惑的编译时错误。而如果我在lambda函数中像这样写[]{retur I==k;},它显示k是未知的。谁能告诉我怎么解决这个问题吗

#include <iostream>
#include <mutex>
#include <sstream>
#include <thread>
#include <chrono>
#include <condition_variable>
using namespace std;
condition_variable cv;
mutex m;
int i;
bool check_func(int i,int k)
{
    return i == k;
}
void print(int k)
{
   unique_lock<mutex> lk(m);
   cv.wait(lk,check_func(i,k));            // Line 33
   cout<<"Thread no. "<<this_thread::get_id()<<" parameter "<<k<<"\n";
   i++;
   return;
}
int main() 
{
    thread threads[10];
    for(int i = 0; i < 10; i++)
       threads[i] = thread(print,i);
    for(auto &t : threads)
       t.join();
    return 0;
}
#包括
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
条件变量cv;
互斥m;
int i;
布尔校验函数(整数i,整数k)
{
返回i==k;
}
空白打印(整数k)
{
唯一锁lk(m);
cv.wait(lk,check_func(i,k));//第33行
cout接受一个谓词,这是一个返回bool的可调用一元函数。
wait()
使用该谓词如下:

while (!pred()) {
    wait(lock);
}
check_func(i,k)
是一个
bool
。它不可调用,而且是一个常量,这违背了目的。你在等待一些可以更改的东西。你需要将它包装成可以重复调用的东西,比如lambda:

   cv.wait(lk, [&]{ return check_func(i,k); });
获取一个谓词,该谓词是返回bool的可调用一元函数。
wait()
使用该谓词如下:

while (!pred()) {
    wait(lock);
}
check_func(i,k)
是一个
bool
。它不可调用,而且是一个常量,这违背了目的。你在等待一些可以更改的东西。你需要将它包装成可以重复调用的东西,比如lambda:

   cv.wait(lk, [&]{ return check_func(i,k); });

要澄清一点,它实际上不是一个常量——它是一个计算为布尔值的表达式,该值是传递给
wait
(不是函数本身)的值。我相信在check_func之前应该有一个return关键字。在这之后,它不会导致任何编译时错误。但是在那之后,它被挂起,导致时间限制超出,并且没有打印任何内容?@user好吧,你所有的线程都在等待一些永远不会发生的事情发生。这是一个编程逻辑错误。要请澄清一点,它实际上不是一个常量——它是一个计算为布尔值的表达式,该值是传递给
wait
(不是函数本身)的值。我相信在check_func之前应该有一个return关键字。在这之后,它不会导致任何编译时错误。但在那之后,它被挂起,导致时间限制超出,并且没有打印任何内容?@user好吧,你所有的线程都在等待一些永远不会发生的事情发生。这是一个编程逻辑错误。