卓越飞翔博客卓越飞翔博客

卓越飞翔 - 您值得收藏的技术分享站
技术文章76056本站已运行4318

C++ lambda 表达式中的线程安全问题解决

解决 lambda 表达式中的线程安全问题:隐式捕获会引起线程安全问题,因为多个线程可以同时访问相同的变量,导致数据竞争。使用显式捕获机制可以解决这个问题,因为它允许开发者指定要捕获的变量,从而避免数据竞争。举例说明了使用显式捕获来创建线程安全的 lambda 表达式,该表达式避免了数据竞争和异常。

C++ lambda 表达式中的线程安全问题解决

C++ lambda 表达式中的线程安全问题解决

lambda 表达式中的隐式捕获

lambda 表达式可以通过隐式捕获机制访问其作用域内的变量。然而,当多线程访问 lambda 表达式时,这会引起线程安全问题。

std::vector<int> numbers = {1, 2, 3, 4, 5};

std::thread t1([&numbers]() {
    // 多个线程可能同时访问 numbers,导致数据竞争
    for (int number : numbers) {
        std::cout << number << std::endl;
    }
});

std::thread t2([&numbers]() {
    // 另一个线程也可能同时访问 numbers,导致数据竞争
    for (int number : numbers) {
        numbers[number - 1] = 0; // 可能导致异常
    }
});

线程安全的 lambda 表达式

要解决这个问题,可以使用 lambda 的显式捕获机制。显式捕获允许开发者指定要捕获的变量,从而避免数据竞争。

实战案例

std::vector<int> numbers = {1, 2, 3, 4, 5};

// 使用显式捕获保证线程安全
std::thread t1([numbers]() {
    for (int number : numbers) {
        std::cout << number << std::endl;
    }
});

std::thread t2([numbers]() {
    for (int number : numbers) {
        numbers[number - 1] = 0; // 因为 numbers 是 const 的,所以不会导致异常
    }
});
卓越飞翔博客
上一篇: C++ 类型转换函数的详解与应用
下一篇: 返回列表
留言与评论(共有 0 条评论)
   
验证码:
隐藏边栏