C++ 不同线程之间传值

不同线程之间传值,常见有以下五种安全可靠 的方式,避免用全局变量裸暴露


通过线程函数参数传值(最基本)

cpp 复制代码
#include <iostream>
#include <thread>

void threadFunc(int val) {
    std::cout << "Thread received: " << val << std::endl;
}

int main() {
    int value = 42;
    std::thread t(threadFunc, value);
    t.join();
}

⚠️注意:传入的是拷贝,若想共享变量,需用引用或指针。


通过 std::ref 传引用

cpp 复制代码
#include <iostream>
#include <thread>

void threadFunc(int& val) {
    val += 10;
}

int main() {
    int value = 42;
    std::thread t(threadFunc, std::ref(value));
    t.join();
    std::cout << value << std::endl;  // 输出 52
}

⚠️多线程修改同一变量,要加锁。


共享数据 + 互斥锁 std::mutex 保护

cpp 复制代码
#include <iostream>
#include <thread>
#include <mutex>

int sharedData = 0;
std::mutex mtx;

void threadFunc() {
    std::lock_guard<std::mutex> lock(mtx);
    sharedData += 1;
}

int main() {
    std::thread t1(threadFunc);
    std::thread t2(threadFunc);
    t1.join();
    t2.join();
    std::cout << sharedData << std::endl;
}

使用 std::condition_variable 通知传值

线程A生产数据,线程B等待并消费:

cpp 复制代码
#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>

int data = 0;
bool ready = false;
std::mutex mtx;
std::condition_variable cv;

void producer() {
    {
        std::lock_guard<std::mutex> lock(mtx);
        data = 42;
        ready = true;
    }
    cv.notify_one();
}

void consumer() {
    std::unique_lock<std::mutex> lock(mtx);
    cv.wait(lock, [] { return ready; });
    std::cout << "Received data: " << data << std::endl;
}

int main() {
    std::thread t1(consumer);
    std::thread t2(producer);
    t1.join();
    t2.join();
}

线程安全队列传值(推荐,解耦好)

比如:

cpp 复制代码
#include <iostream>
#include <thread>
#include <queue>
#include <mutex>
#include <condition_variable>

std::queue<int> msgQueue;
std::mutex mtx;
std::condition_variable cv;

void producer() {
    for (int i = 0; i < 5; ++i) {
        {
            std::lock_guard<std::mutex> lock(mtx);
            msgQueue.push(i);
        }
        cv.notify_one();
    }
}

void consumer() {
    for (int i = 0; i < 5; ++i) {
        std::unique_lock<std::mutex> lock(mtx);
        cv.wait(lock, [] { return !msgQueue.empty(); });
        int val = msgQueue.front();
        msgQueue.pop();
        std::cout << "Consumed: " << val << std::endl;
    }
}

int main() {
    std::thread t1(consumer);
    std::thread t2(producer);
    t1.join();
    t2.join();
}

总结建议

需求 推荐方式
简单只传一次值 线程参数或 std::ref
多次共享或修改数据 共享变量 + std::mutex
需要通知、等待 std::condition_variable
大量数据流、解耦需求 线程安全队列(配合锁或封装类)

你如果告诉我具体场景(比如:线程A接收串口数据,线程B处理,线程C保存文件),我可以帮你出针对性的设计方案。你要举例吗?

相关推荐
R-G-B3 小时前
【25】MFC入门到精通——MFC静态文本框 中字符串 连续输出 不覆盖先前的文本 换行输出
c++·mfc·mfc静态文本框输出字符串·mfc静态文本框连续输出字符串·mfc静态文本框换行输出字符串
我搞slam3 小时前
快乐数--leetcode
算法·leetcode·哈希算法
WWZZ20254 小时前
快速上手大模型:机器学习3(多元线性回归及梯度、向量化、正规方程)
人工智能·算法·机器学习·机器人·slam·具身感知
应用市场5 小时前
构建自定义命令行工具 - 打造专属指令体
开发语言·windows·python
东方佑5 小时前
从字符串中提取重复子串的Python算法解析
windows·python·算法
西阳未落5 小时前
LeetCode——二分(进阶)
算法·leetcode·职场和发展
通信小呆呆5 小时前
以矩阵视角统一理解:外积、Kronecker 积与 Khatri–Rao 积(含MATLAB可视化)
线性代数·算法·matlab·矩阵·信号处理
FFZero15 小时前
【C++/Lua联合开发】 (二) Lua调用C++函数
c++·junit·lua
Dfreedom.5 小时前
一文掌握Python四大核心数据结构:变量、结构体、类与枚举
开发语言·数据结构·python·变量·数据类型
一半烟火以谋生5 小时前
Python + Pytest + Allure 自动化测试报告教程
开发语言·python·pytest