设一个int型的一维数组,数组长度是1,000,000,计算数组全部元素的和。 要求: 1)编制一个串行程序,仅有一个线程完成上述计算。 2)编制一个多线程程序,除main线程外,派生两个子线程完成上述计算,main线程负责数据输入和输出计算结果,两个子线程发执行共同计算。 分别获得以上两个程序的计算时间,注意两种情况计算结果应该相同,对比分析。 提示:clock()是C/C++中的计时函数(头文件time.h),与其相关的数据类型是clock_t,通过clock()可以获得当前的系统时间。 注意:将数组作为共享变量,两个线程并发访问,通过线程的同步方法进行控制。
时间: 2024-02-23 07:02:06 浏览: 153
详解C++中的一维数组和二维数组
5星 · 资源好评率100%
1) 串行程序计算数组全部元素的和:
```
#include <stdio.h>
#include <time.h>
#define ARRAY_SIZE 1000000
int main() {
int array[ARRAY_SIZE];
int i, sum = 0;
clock_t start, end;
// 初始化数组
for (i = 0; i < ARRAY_SIZE; i++) {
array[i] = i;
}
start = clock();
// 计算数组元素的和
for (i = 0; i < ARRAY_SIZE; i++) {
sum += array[i];
}
end = clock();
printf("串行程序计算结果:%d\n", sum);
printf("串行程序计算时间:%f秒\n", (double)(end - start) / CLOCKS_PER_SEC);
return 0;
}
```
2) 多线程程序计算数组全部元素的和:
```
#include <stdio.h>
#include <pthread.h>
#include <time.h>
#define ARRAY_SIZE 1000000
int array[ARRAY_SIZE];
int sum1 = 0, sum2 = 0;
pthread_mutex_t mutex;
void* thread1(void* arg) {
int i;
for (i = 0; i < ARRAY_SIZE / 2; i++) {
pthread_mutex_lock(&mutex);
sum1 += array[i];
pthread_mutex_unlock(&mutex);
}
pthread_exit(NULL);
}
void* thread2(void* arg) {
int i;
for (i = ARRAY_SIZE / 2; i < ARRAY_SIZE; i++) {
pthread_mutex_lock(&mutex);
sum2 += array[i];
pthread_mutex_unlock(&mutex);
}
pthread_exit(NULL);
}
int main() {
int i, sum = 0;
pthread_t tid1, tid2;
clock_t start, end;
// 初始化数组
for (i = 0; i < ARRAY_SIZE; i++) {
array[i] = i;
}
// 初始化互斥锁
pthread_mutex_init(&mutex, NULL);
start = clock();
// 创建两个子线程计算数组元素的和
pthread_create(&tid1, NULL, thread1, NULL);
pthread_create(&tid2, NULL, thread2, NULL);
// 等待子线程结束
pthread_join(tid1, NULL);
pthread_join(tid2, NULL);
end = clock();
sum = sum1 + sum2;
printf("多线程程序计算结果:%d\n", sum);
printf("多线程程序计算时间:%f秒\n", (double)(end - start) / CLOCKS_PER_SEC);
// 销毁互斥锁
pthread_mutex_destroy(&mutex);
return 0;
}
```
在以上两个程序中,我们首先创建了一个包含100万个元素的整型数组,然后通过两种不同的方式计算数组元素的和。对于串行程序,我们直接使用单个线程进行计算;对于多线程程序,我们创建了两个子线程进行并发计算,通过互斥锁来保证线程之间的同步访问。
在测试时,我们可以使用clock()函数来获得程序运行的时间,从而比较两种程序的计算时间。需要注意的是,我们需要通过互斥锁来保证多个线程对共享变量的安全访问,否则可能会出现计算结果不正确的问题。
通过测试可以发现,多线程程序的计算时间明显短于串行程序,这是因为多线程程序能够利用多核处理器的并行计算能力,提高计算效率。同时,通过互斥锁来保证线程之间的同步访问,也能够保证计算结果的正确性。
阅读全文