Windows多线程程序:如何依次读输入后并行计算?
解决方案
核心思路
让主线程统一完成所有输入的读取,再将输入数据作为参数传递给各个工作线程。线程启动后直接使用传入的数据执行计算,既避免了多线程争抢终端输入的问题,又能实现计算阶段的并行执行。
修改后的代码示例
#include <windows.h> #include <cassert> #include <iostream> // 定义线程参数结构体,用于传递输入数据 struct ThreadData { int input; // 可根据需求扩展其他计算参数或结果存储字段 }; DWORD WINAPI F1(LPVOID lpParameter) { ThreadData* data = static_cast<ThreadData*>(lpParameter); // 示例计算逻辑:输入值乘以2 int result = data->input * 2; std::cout << "线程1计算结果:" << result << std::endl; return 0; } DWORD WINAPI F2(LPVOID lpParameter) { ThreadData* data = static_cast<ThreadData*>(lpParameter); // 示例计算逻辑:输入值加10 int result = data->input + 10; std::cout << "线程2计算结果:" << result << std::endl; return 0; } const int THREADS_COUNT = 2; int main() { ThreadData threadData[THREADS_COUNT]; // 主线程依次读取输入 std::cout << "请输入线程1的计算数据:"; std::cin >> threadData[0].input; std::cout << "请输入线程2的计算数据:"; std::cin >> threadData[1].input; HANDLE thread_handles[THREADS_COUNT]; // 创建线程并传递对应的数据 thread_handles[0] = CreateThread(NULL, 0, F1, &threadData[0], 0, NULL); assert(thread_handles[0] != NULL); thread_handles[1] = CreateThread(NULL, 0, F2, &threadData[1], 0, NULL); assert(thread_handles[1] != NULL); WaitForMultipleObjects(THREADS_COUNT, thread_handles, TRUE, INFINITE); CloseHandle(thread_handles[0]); CloseHandle(thread_handles[1]); return 0; }
关键说明
- 参数传递:通过
ThreadData结构体封装输入数据,作为参数传递给线程函数,线程内部通过类型转换获取数据,保证数据安全传递。 - 输入控制:所有输入操作由主线程完成,确保输入顺序完全可控,不会出现多线程同时读取终端的混乱场景。
- 并行计算:线程启动后直接使用预输入的数据执行计算,两个线程的计算过程并行进行,充分利用多核资源提升效率。
内容的提问来源于stack exchange,提问作者user19130076
相关产品推荐
相关产品推荐

