织芜 2024-04-06 14:46 采纳率: 70.8%
浏览 9
已结题

使用g++编译器写多线程程序时有问题

C++版本:201703
g++版本:13.2.0
IDE:vscode
不带多线程的代码可以编译,但是带多线程的代码Intellisense就报错了,错误如下:

[{
    "resource": "/e:/Code/multithread.cpp",
    "owner": "C/C++: IntelliSense",
    "code": "20",
    "severity": 8,
    "message": "未定义标识符 \"lock2\"",
    "source": "C/C++",
    "startLineNumber": 22,
    "startColumn": 2,
    "endLineNumber": 22,
    "endColumn": 7
},{
    "resource": "/e:/Code/multithread.cpp",
    "owner": "C/C++: IntelliSense",
    "code": "289",
    "severity": 8,
    "message": "没有与参数列表匹配的构造函数 \"std::thread::thread\" 实例",
    "source": "C/C++",
    "startLineNumber": 35,
    "startColumn": 17,
    "endLineNumber": 35,
    "endColumn": 25,
    "relatedInformation": [
        {
            "startLineNumber": 35,
            "startColumn": 17,
            "endLineNumber": 35,
            "endColumn": 25,
            "message": "参数类型为:  (void (Box &from, Box &to, int num), <error-type>, <error-type>, int)",
            "resource": "/e:/Code/multithread.cpp"
        }
    ]
},{
    "resource": "/e:/Code/multithread.cpp",
    "owner": "C/C++: IntelliSense",
    "code": "20",
    "severity": 8,
    "message": "未定义标识符 \"from\"",
    "source": "C/C++",
    "startLineNumber": 35,
    "startColumn": 35,
    "endLineNumber": 35,
    "endColumn": 39
},{
    "resource": "/e:/Code/multithread.cpp",
    "owner": "C/C++: IntelliSense",
    "code": "20",
    "severity": 8,
    "message": "未定义标识符 \"to\"",
    "source": "C/C++",
    "startLineNumber": 35,
    "startColumn": 50,
    "endLineNumber": 35,
    "endColumn": 52
},{
    "resource": "/e:/Code/multithread.cpp",
    "owner": "C/C++: IntelliSense",
    "code": "289",
    "severity": 8,
    "message": "没有与参数列表匹配的构造函数 \"std::thread::thread\" 实例",
    "source": "C/C++",
    "startLineNumber": 36,
    "startColumn": 17,
    "endLineNumber": 36,
    "endColumn": 25,
    "relatedInformation": [
        {
            "startLineNumber": 36,
            "startColumn": 17,
            "endLineNumber": 36,
            "endColumn": 25,
            "message": "参数类型为:  (void (Box &from, Box &to, int num), <error-type>, <error-type>, int)",
            "resource": "/e:/Code/multithread.cpp"
        }
    ]
},{
    "resource": "/e:/Code/multithread.cpp",
    "owner": "C/C++: IntelliSense",
    "code": "304",
    "severity": 8,
    "message": "没有与参数列表匹配的 重载函数 \"std::condition_variable::wait_for\" 实例",
    "source": "C/C++",
    "startLineNumber": 71,
    "startColumn": 11,
    "endLineNumber": 71,
    "endColumn": 19,
    "relatedInformation": [
        {
            "startLineNumber": 71,
            "startColumn": 11,
            "endLineNumber": 71,
            "endColumn": 19,
            "message": "参数类型为:  (std::mutex, <error-type>)",
            "resource": "/e:/Code/multithread.cpp"
        },
        {
            "startLineNumber": 71,
            "startColumn": 11,
            "endLineNumber": 71,
            "endColumn": 19,
            "message": "对象类型是:  std::condition_variable",
            "resource": "/e:/Code/multithread.cpp"
        }
    ]
},{
    "resource": "/e:/Code/multithread.cpp",
    "owner": "C/C++: IntelliSense",
    "code": "20",
    "severity": 8,
    "message": "未定义标识符 \"seconds\"",
    "source": "C/C++",
    "startLineNumber": 71,
    "startColumn": 24,
    "endLineNumber": 71,
    "endColumn": 31
}]

代码如下:


#if 1 //from to 

#include<iostream>
#include<thread>
#include<mutex>

class Box{
    public:
        Box(int m):n(m){
            
        }
        
        int n;
        std::mutex mut; //共享同一对象资源,使用同一互斥量 
};

void transfer(Box &from,Box &to,int num){
    std::unique_lock<std::mutex> lock1(from.mut,std::defer_lock);
    std::unique_lock<std::mutex> lock1(to.mut,std::defer_lock);
    
    lock1.lock();
    lock2.lock();
    
    from.n-=num;
    to.n+=num;
    
    lock1.unlock();
    lock2.unlock();
}

int main(){
    Box b1(100);
    Box b2(50);
    
    std::thread t1(transfer,std::ref(from),std::ref(to),50);
    std::thread t2(transfer,std::ref(to),std::ref(from),20);
    
    t1.join();
    t2.join();
    
    std::cout<<"b1:"<<b1.n;
    std::cout<<" b2:"<<b2.n;
}

#endif

#if 1 //输入同时... 

#include<iostream>
#include<thread>
#include<mutex>
#include<condition_variable>
#include<chrono>

using namespace std;

condition_variable cv;

void input(int &val){
    cin>>val;
    cv.notify_one();
}

int main(){
    int value;
    thread inputThread(input,ref(value));
    
    cout<<"请输入:"<<endl;
    
    mutex mut;
    while(cv.wait_for(mut,seconds(1))==std::cv_status::timeout){
        cout<<".";
    }
    
    cout<<"输入了"<<value<<endl; 
    return 0;
}

#endif




  • 写回答

3条回答 默认 最新

  • 关注

    下午好🌅🌅🌅
    本答案参考ChatGPT-3.5

    问题描述:使用g++编译器写多线程程序时在包含多线程的代码中会出现IntelliSense报错,未定义标识符“lock2”、未定义标识符“from”等等。

    问题分析:IntelliSense报错表明代码存在语法或者语义错误,因此需要检查代码的语法、语义等方面,并根据错误信息进行相应的修改。

    解决方案:

    1. 首先检查代码是否引入了必需的头文件,包括iostream、thread、mutex等。
    2. 对于“未定义标识符”等错误,需要检查是否正确定义了相关的变量或对象。在这个代码中,出现的lock2未定义的问题是代码笔误导致,并需要修改为lock1。对于from和to未定义的问题,需要在main函数中传入正确的参数。
    3. 对于“没有与参数列表匹配的构造函数”等错误,需要检查所调用的函数或对象的参数列表是否与调用时传入的参数类型和数量匹配。在这个代码中,需要使用std::ref将对象传递给func,否则会出现类型不匹配的问题。
    4. 对于“没有与参数列表匹配的重载函数”等错误,需要检查函数或对象是否支持调用的重载,并检查传入的参数是否满足函数或对象的调用要求。在这个代码中,使用std::condition_variable::wait_for时需要传入第二个参数。
    5. 最后,对于代码编译后的报错信息,需要根据实际错误情况逐一解决,直至编译成功。

    以下是修改后的代码:

    #include #include #include #include

    class Box{ public: Box(int m):n(m){

        }
        
        int n;
        std::mutex mut; //共享同一对象资源,使用同一互斥量 
    

    };

    void transfer(Box &from,Box &to,int num){ std::unique_lockstd::mutex lock1(from.mut,std::defer_lock); std::unique_lockstd::mutex lock2(to.mut,std::defer_lock); //修改此处的lock1->lock2,修正笔误

    lock1.lock();
    lock2.lock();
    
    from.n-=num;
    to.n+=num;
    
    lock1.unlock();
    lock2.unlock();
    

    }

    int main(){ Box b1(100); Box b2(50);

    std::thread t1(transfer,std::ref(b1),std::ref(b2),50);   //使用std::ref将对象传递给func
    std::thread t2(transfer,std::ref(b2),std::ref(b1),20);
    
    t1.join();
    t2.join();
    
    std::cout<<"b1:"<<b1.n<<" b2:"<<b2.n<<std::endl;
    
    std::mutex mut;
    std::unique_lock<std::mutex> lock(mut);
    std::chrono::seconds seconds(1);      //使用std::chrono::seconds传递时间
    std::condition_variable cond;
    cond.wait_for(lock,seconds);          //使用std::condition_variable::wait_for需要传递第二个参数
    
    return 0;
    

    }

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 4月21日
  • 已采纳回答 4月13日
  • 创建了问题 4月6日

悬赏问题

  • ¥15 curl 命令调用正常,程序调用报 java.net.ConnectException: connection refused
  • ¥20 关于web前端如何播放二次加密m3u8视频的问题
  • ¥20 spring boot集成mqtt的使用问题
  • ¥15 使用百度地图api 位置函数报错?
  • ¥15 metamask如何添加TRON自定义网络
  • ¥66 关于川崎机器人调速问题
  • ¥15 winFrom界面无法打开
  • ¥30 crossover21 ARM64版本安装软件问题
  • ¥15 mymetaobjecthandler没有进入
  • ¥15 mmo能不能做客户端怪物