上述主函数中编译报错,没有start_time和end_time的定义
时间: 2024-10-09 19:00:56 浏览: 44
对不起,您提到的`start_time`和`end_time`变量是在主线程中定义的,但在子线程中直接访问会出错,因为它们属于主线程的数据范围。在Windows API中,如需在子线程中共享数据,通常需要通过`CreateThread`的`LPVOID lpParameter`参数传递指向结构体的指针,然后在线程内部解包。
以下是修复后的代码示例:
```cpp
#include <windows.h>
#include <iostream>
#include <mutex> // 添加头文件以支持跨线程共享
// 结构体用于存储线程相关的计时信息
struct TimingData {
HANDLE hThread;
LARGE_INTEGER start_time;
};
// 更新线程函数,增加计时器部分
DWORD WINAPI ThreadExecutiveLZZ(LPVOID lpParameter) {
TimingData* data = reinterpret_cast<TimingData*>(lpParameter);
// 获取初始时间
data->start_time.QuadPart = QueryPerformanceCounter(nullptr);
Sleep(2000); // 线程睡眠2秒作为计时演示
data->end_time.QuadPart = QueryPerformanceCounter(nullptr);
// ... 其他代码 ...
return 0;
}
int main() {
// 定义全局互斥量,防止并发访问数据
std::mutex mutex;
// 创建一个结构体数组,存储每个线程的计时数据
TimingData thread_data[2];
hMutex = CreateMutex(NULL, FALSE, NULL); // 创建互斥锁
// 初始化线程数据
thread_data[0].hThread = nullptr;
thread_data[0].start_time.QuadPart = 0;
thread_data[1].hThread = nullptr;
thread_data[1].start_time.QuadPart = 0;
HANDLE hThread[2];
int nPID0 = 0, nPID1 = 1;
if ((hThread[0] = CreateThread(NULL,
0,
ThreadExecutiveLZZ,
&thread_data[0],
0,
NULL)) != NULL) {
thread_data[0].hThread = hThread[0];
// 线程创建其他部分保持不变
}
if ((hThread[1] = CreateThread(NULL,
0,
ThreadExecutiveLZZ,
&thread_data[1],
0,
NULL)) != NULL) {
thread_data[1].hThread = hThread[1];
// 线程创建其他部分保持不变
}
// 等待所有线程结束后,获取结束时间并计算总耗时
WaitForMultipleObjects(2, hThread, TRUE, INFINITE);
CloseHandle(hMutex); // 关闭互斥锁
mutex.lock(); // 锁住互斥量,确保数据安全
LARGE_INTEGER total_time;
total_time.QuadPart = thread_data[0].end_time.QuadPart - thread_data[0].start_time.QuadPart +
thread_data[1].end_time.QuadPart - thread_data[1].start_time.QuadPart;
float totalTimeSecs = (float)total_time.QuadPart / QueryPerformanceFrequency(nullptr);
std::cout << "Total process time: " << totalTimeSecs << " seconds.\n";
mutex.unlock();
return 0;
}
```
现在,`start_time`和`end_time`被封装在`TimingData`结构体中,并通过`lpParameter`传递给子线程。在主线程中,我们需要解锁互斥量才能读取到子线程的计时结果。
阅读全文