请完成代码#include<stdio.h> #include<windows.h> DWORD Sum1,Sum2; DWORD WINAPI Summation1(LPVOID Param) { DWORD Upper=*(DWORD*)Param; for(DWORD i=0;i<=Upper;i++) Sum1+=i; return 0; } DWORD WINAPI Summation2(LPVOID Param) { DWORD Upper=*(DWORD*)Param; for(DWORD i=0;i<=Upper;i++) Sum2+=i; return 0; } int main(int argc,char *argv[]) { DWORD ThreadId1,ThreadId2; HANDLE ThreadHandle1,ThreadHandle2; HANDLE Thread[2]; int Param1,Param2; Param1 = atoi(argv[1]); if(Param1<0) { printf("An interger parameter is required.\n"); return -1; } Param2 = atoi(argv[2]); if(Param2<0) { printf("An interger parameter is required.\n"); return -1; } ThreadHandle1 = CreateThread( NULL, 0, Summation1, &Param1, 0, &ThreadId1); ThreadHandle2 = CreateThread( NULL, 0, Summation2, &Param2, 0, &ThreadId2); Thread[0]=ThreadHandle1; Thread[1]=ThreadHandle2; if((ThreadHandle1!=NULL)&&(ThreadHandle2!=NULL)) { printf("ThreadId1=%d\n", ThreadId1); printf("ThreadId2=%d\n", ThreadId2); WaitForMultipleObjects(2,Thread,TRUE,INFINITE); CloseHandle(ThreadHandle1); CloseHandle(ThreadHandle2); printf("sum1=%d\n", Sum1); printf("sum2=%d\n", Sum2); } return 0; }
时间: 2023-06-27 14:05:49 浏览: 94
这是一个利用多线程实现求和的代码,其中使用了Windows API中的CreateThread函数和WaitForMultipleObjects函数。
代码解析如下:
1. 定义了两个全局变量Sum1和Sum2,用于存储两个线程计算的结果。
2. 定义了两个线程函数Summation1和Summation2,分别计算从0到参数Upper之间所有整数的和。这里的Upper是通过CreateThread函数的最后一个参数传递进来的。
3. 在main函数中,通过命令行参数获取两个参数Param1和Param2。如果这两个参数不是正整数,则程序会提示用户重新输入。
4. 通过CreateThread函数创建两个线程,并将线程句柄分别存储在ThreadHandle1和ThreadHandle2中。
5. 将ThreadHandle1和ThreadHandle2存储在Thread数组中,然后调用WaitForMultipleObjects函数等待两个线程都执行结束。
6. 关闭线程句柄,并输出Sum1和Sum2的值。
完整代码如下:
相关问题
#include<stdio.h> #include<windows.h> DWORD Sum; DWORD WINAPI Summation(LPVOID Param) { DWORD Upper = *(DWORD*)Param; for (DWORD i = 0; i<= Upper; i++) Sum += i; return 0; } int main(int argc, char *argv[]) { DWORD ThreadId; HANDLE ThreadHandle; int Param; Param = atoi(argv[1]); if (Param <0) { printf("An interger parameter is required.\n"); return -1; } ThreadHandle = CreateThread( NULL, 0, Summation, &Param, 0, &ThreadId); if(ThreadHandle != NULL) { printf("ThreadId=%d\n", ThreadId); WaitForSingleObject(ThreadHandle, INFINITE); CloseHandle(ThreadHandle); printf("sum=%d\n", Sum); } return 0; }代码注释
这是一个使用Windows API创建线程的C语言程序,实现了多线程计算1到指定上界的整数和,并输出结果。
代码注释如下:
```c
#include<stdio.h> // 引入标准输入输出库
#include<windows.h> // 引入Windows API库
DWORD Sum; // 定义一个全局变量Sum,用于保存计算结果
// 线程函数,计算1到指定上界的整数和
DWORD WINAPI Summation(LPVOID Param) {
DWORD Upper = *(DWORD*)Param; // 读取传入的上界参数
for (DWORD i = 0; i<= Upper; i++) // 计算1到上界的整数和
Sum += i; // 将每个整数累加到结果中
return 0; // 返回0表示线程执行完毕
}
// 主函数,程序入口
int main(int argc, char *argv[]) {
DWORD ThreadId; // 定义线程ID
HANDLE ThreadHandle; // 定义线程句柄
int Param; // 定义传入的上界参数
Param = atoi(argv[1]); // 读取传入的参数并转换为整数类型
if (Param <0) // 判断参数是否小于0
{
printf("An interger parameter is required.\n"); // 输出错误提示信息
return -1; // 返回错误码-1
}
ThreadHandle = CreateThread( // 创建线程
NULL, // 默认安全属性
0, // 默认栈大小
Summation, // 调用Summation函数
&Param, // 传入上界参数
0, // 默认线程启动标志
&ThreadId // 保存线程ID
);
if(ThreadHandle != NULL) // 如果线程创建成功
{
printf("ThreadId=%d\n", ThreadId); // 输出线程ID
WaitForSingleObject(ThreadHandle, INFINITE); // 等待线程结束
CloseHandle(ThreadHandle); // 关闭线程句柄
printf("sum=%d\n", Sum); // 输出计算结果
}
return 0; // 返回0表示程序正常结束
}
```
改善代码#include<stdio.h> #include<windows.h> DWORD Sum1,Sum2; DWORD WINAPI Summation1(LPVOID Param) { DWORD Upper=(DWORD)Param; for(DWORD i=0;i<=Upper;i++) Sum1+=i; return 0; } DWORD WINAPI Summation2(LPVOID Param) { DWORD Upper=(DWORD)Param; for(DWORD i=0;i<=Upper;i++) Sum2+=i; return 0; } int main(int argc,char *argv[]) { DWORD ThreadId1,ThreadId2; HANDLE ThreadHandle1,ThreadHandle2; HANDLE Thread[2]; int Param1,Param2; Param1 = atoi(argv[1]); if(Param1<0) { printf("An interger parameter is required.\n"); return -1; } Param2 = atoi(argv[2]); if(Param2<0) { printf("An interger parameter is required.\n"); return -1; } ThreadHandle1 = CreateThread( NULL, 0, Summation1, &Param1, 0, &ThreadId1); ThreadHandle2 = CreateThread( NULL, 0, Summation2, &Param2, 0, &ThreadId2); Thread[0]=ThreadHandle1; Thread[1]=ThreadHandle2; if((ThreadHandle1!=NULL)&&(ThreadHandle2!=NULL)) { printf("ThreadId1=%d\n", ThreadId1); printf("ThreadId2=%d\n", ThreadId2); WaitForMultipleObjects(2,Thread,TRUE,INFINITE); CloseHandle(ThreadHandle1); CloseHandle(ThreadHandle2); printf("sum1=%d\n", Sum1); printf("sum2=%d\n", Sum2); } return 0; }
以下是改善后的代码,主要是添加了注释、修改了变量名、添加了错误处理和释放资源的代码:
```c
#include <stdio.h>
#include <windows.h>
DWORD sum1 = 0, sum2 = 0;
// 线程1的函数,计算从0到upper的整数和
DWORD WINAPI Summation1(LPVOID param) {
DWORD upper = (DWORD)param;
for (DWORD i = 0; i <= upper; i++) {
sum1 += i;
}
return 0;
}
// 线程2的函数,计算从0到upper的整数和
DWORD WINAPI Summation2(LPVOID param) {
DWORD upper = (DWORD)param;
for (DWORD i = 0; i <= upper; i++) {
sum2 += i;
}
return 0;
}
int main(int argc, char* argv[]) {
// 命令行参数转换为整数
int param1 = atoi(argv[1]);
int param2 = atoi(argv[2]);
// 检查参数是否合法
if (param1 < 0 || param2 < 0) {
printf("An integer parameter is required.\n");
return -1;
}
// 创建线程1和线程2
HANDLE threadHandle1 = CreateThread(NULL, 0, Summation1, ¶m1, 0, NULL);
HANDLE threadHandle2 = CreateThread(NULL, 0, Summation2, ¶m2, 0, NULL);
if (threadHandle1 == NULL || threadHandle2 == NULL) {
printf("Failed to create threads.\n");
return -1;
}
// 等待线程1和线程2完成
HANDLE threadHandles[2] = { threadHandle1, threadHandle2 };
DWORD waitResult = WaitForMultipleObjects(2, threadHandles, TRUE, INFINITE);
if (waitResult != WAIT_OBJECT_0) {
printf("Failed to wait for threads.\n");
CloseHandle(threadHandle1);
CloseHandle(threadHandle2);
return -1;
}
// 关闭线程句柄并输出结果
CloseHandle(threadHandle1);
CloseHandle(threadHandle2);
printf("sum1=%d\n", sum1);
printf("sum2=%d\n", sum2);
return 0;
}
```
改善后的代码添加了注释,使代码更加易读和易懂。同时,添加了错误处理和释放资源的代码,以确保程序的稳定性和健壮性。
阅读全文