方法阻塞的解决方案之一

1、简单使用

一个h一个cpp文件

cpp 复制代码
#pragma once
#include <iostream>
#include <thread>
#include <atomic>
#include <chrono>
#include <string>

class Person {

public:
    struct dog {
        std::string name;
        int age;
    };

public:
    void a(std::atomic<bool>& running, int param1, double param2, const std::string& param3);

    void startA(int param1, double param2, const std::string& param3);
};
cpp 复制代码
#include <iostream>
#include <thread>
#include <atomic>
#include <chrono>
#include <string>
#include "osg.h"

void Person::a(std::atomic<bool>& running, int param1, double param2, const std::string& param3) {
    std::cout << "Function a started with params " << param1 << ", " << param2 << ", " << param3 << "." << std::endl;
    // 模拟耗时操作
    while (running) {
        // 执行一些操作
    }
    std::cout << "Function a ended." << std::endl;
}

void Person::startA(int param1, double param2, const std::string& param3) {
    std::atomic<bool> running(true);

    // 创建并启动线程
    std::thread thread_a(&Person::a, this, std::ref(running), param1, param2, param3);

    std::this_thread::sleep_for(std::chrono::seconds(10));
    if (running.load()) {
        std::cout << "stop" << std::endl;
        running = false;
    }

    // 等待线程完成执行
    if (thread_a.joinable()) {
        thread_a.join();
    }
}
    int main() {
        Person person;
        person.startA(42, 3.14, "Hello");

        // ... 其他代码 ...
        return 0;
    }

2、方法A中存在引用

错误示例:

将sum执行的数据保存下来

cpp 复制代码
#include <iostream>
#include <thread>
#include <atomic>
#include <chrono>
#include <string>
#include "osg.h"

void Person::a(std::atomic<bool>& running, int& sum, double param2) {
    std::cout << "Function a started with params " << sum << ", " << param2 << std::endl;
    // 模拟耗时操作
    while (running) {
        // 执行一些操作
        for (int i = 0; i < 10000000; i++) {
            sum = i;
        }
    }
    std::cout << "Function a ended." << std::endl;
}

void Person::startA(int param1, double param2, const std::string& param3) {
    for (int i = 0; i < 2; i++) {
        int sum = 0;
        std::atomic<bool> running(true);
        // 创建并启动线程
        std::thread thread_a(&Person::a, this, std::ref(running), sum, param2);

        std::this_thread::sleep_for(std::chrono::seconds(5));
        if (running.load()) {
            std::cout << "stop" << std::endl;
            running = false;
        }

        // 等待线程完成执行
        if (thread_a.joinable()) {
            thread_a.join();
            std::cout << "等待线程完成执行" << std::endl;
        }

        std::cout << "sum: " <<sum<< std::endl;
    }

    std::cout << "任务结束" << std::endl;

}
int main() {
    Person person;
    person.startA(42, 3.14, "Hello");

    // ... 其他代码 ...
    return 0;
}

编译都过不去

正确示例:

只修改一句

cpp 复制代码
        std::thread thread_a(&Person::a, this, std::ref(running), std::ref(sum), param2);
cpp 复制代码
#include <iostream>
#include <thread>
#include <atomic>
#include <chrono>
#include <string>
#include "osg.h"

void Person::a(std::atomic<bool>& running, int& sum, double param2) {
    std::cout << "Function a started with params " << sum << ", " << param2 << std::endl;
    // 模拟耗时操作
    while (running) {
        // 执行一些操作
        for (int i = 0; i < 1000000000; i++) {
            sum = i;
        }
    }
    std::cout << "Function a ended." << std::endl;
}

void Person::startA(int param1, double param2, const std::string& param3) {
    for (int i = 0; i < 2; i++) {
        int sum = 0;
        std::atomic<bool> running(true);
        // 创建并启动线程
        std::thread thread_a(&Person::a, this, std::ref(running), std::ref(sum), param2);

        std::this_thread::sleep_for(std::chrono::seconds(5));
        if (running.load()) {
            std::cout << "stop" << std::endl;
            running = false;
        }

        // 等待线程完成执行
        if (thread_a.joinable()) {
            thread_a.join();
            std::cout << "等待线程完成执行" << std::endl;
        }

        std::cout << "sum: " <<sum<< std::endl;
    }

    std::cout << "任务结束" << std::endl;

}
int main() {
    Person person;
    person.startA(42, 3.14, "Hello");

    // ... 其他代码 ...
    return 0;
}

3、A方法阻塞时间过长,希望停止

如果Person::a 方法卡住了,那么 if (thread_a.joinable()) { thread_a.join(); } 就阻塞了,std::cout << "sum: " <<sum<< std::endl; 值就得不到了,除非a方法完成了

cpp 复制代码
#include <iostream>
#include <thread>
#include <atomic>
#include <chrono>
#include <string>
#include "osg.h"

void Person::a(std::atomic<bool>& running, int& sum, const double &param2) {
    std::cout << "Function a started with params " << sum << ", " << param2 << std::endl;
    // 模拟耗时操作
    for (int i = 0; i < 10; i++) {
        std::this_thread::sleep_for(std::chrono::seconds(1));
        sum = i;
    }
    std::cout << "Function a ended." << std::endl;

}

void Person::startA(int param1, double param2, const std::string& param3) {
    for (int i = 0; i < 2; i++) {
        int sum = 0;
        std::atomic<bool> running(true);
        // 创建并启动线程
        std::thread thread_a(&Person::a, this, std::ref(running), std::ref(sum), param2);

        std::this_thread::sleep_for(std::chrono::seconds(3));
        if (running.load()) {
            std::cout << "stop" << std::endl;
            running = false;
        }

        // 等待线程完成执行
        if (thread_a.joinable()) {
            thread_a.join();
        }

        std::cout << "sum: " <<sum<< std::endl;
    }

    std::cout << "任务结束" << std::endl;

}
int main() {
    Person person;
    person.startA(42, 3.14, "Hello");

    // ... 其他代码 ...
    return 0;
}

修改:

在每次循环、处理小任务、遍历某数据 中 进行running判断

cpp 复制代码
#include <iostream>
#include <thread>
#include <atomic>
#include <chrono>
#include <string>
#include "osg.h"

void Person::a(std::atomic<bool>& running, int& sum, const double &param2) {
    std::cout << "Function a started with params " << sum << ", " << param2 << std::endl;
        // 模拟耗时操作
    for (int i = 0; i < 10; i++) {
        if (!running) break;
        std::this_thread::sleep_for(std::chrono::seconds(1));
        sum = i;
    }
    std::cout << "Function a ended." << std::endl;

}

void Person::startA(int param1, double param2, const std::string& param3) {
    for (int i = 0; i < 2; i++) {
        int sum = 0;
        std::atomic<bool> running(true);
        // 创建并启动线程
        std::thread thread_a(&Person::a, this, std::ref(running), std::ref(sum), param2);

        std::this_thread::sleep_for(std::chrono::seconds(3));
        if (running.load()) {
            std::cout << "stop" << std::endl;
            running = false;
        }

        // 等待线程完成执行
        if (thread_a.joinable()) {
            thread_a.join();
        }

        std::cout << "sum: " <<sum<< std::endl;
    }

    std::cout << "任务结束" << std::endl;

}
int main() {
    Person person;
    person.startA(42, 3.14, "Hello");

    // ... 其他代码 ...
    return 0;
}
相关推荐
曼巴UE57 小时前
UE5 C++ 第三方动态库的使用
开发语言·c++
C语言小火车7 小时前
【C++八股文】数据结构篇
数据结构·数据库·c++·c++八股文
利以檀本人(梦泽不忙)9 小时前
#T1359. 围成面积
c++·程序人生·算法
汉克老师9 小时前
第十四届蓝桥杯青少组C++国赛[2023.5.28]第二部分编程题(4、 数独填数)
c++·蓝桥杯·蓝桥杯c++·c++蓝桥杯
闻缺陷则喜何志丹9 小时前
【线段树 懒删除堆】P12372 [蓝桥杯 2022 省 Python B] 最优清零方案|普及+
数据结构·c++·线段树·懒删除堆
闻缺陷则喜何志丹9 小时前
【 线段树】P12347 [蓝桥杯 2025 省 A 第二场] 栈与乘积|普及+
数据结构·c++·蓝桥杯·线段树·洛谷
徐归阳9 小时前
数组本身的深入解析
数据结构·c++·算法
白榆!10 小时前
string类的实现
开发语言·c++·算法
励志五个月成为嵌入式糕手10 小时前
0904 类的继承
开发语言·c++
睡不醒的kun10 小时前
leetcode算法刷题的第二十六天
数据结构·c++·算法·leetcode·职场和发展·贪心算法