本次实验课程内容没有更新,留了一个作业,还是对于线程的训练,内容如下:
按照上节课的内容,对代码进行下修改,如下:
#include<stdlib.h>
#include<stdio.h>
#include<pthread.h>
#define NUMBER 10
#define CPU_NUM 2
#define CHILD (NUMBER/CPU_NUM)
int array[10] = {
12,7,9,10,11,16,3,5,7,20};
struct param {
int start;
int end;
};
struct result {
int sum[CHILD];
};
void *select_sort(void *arg) {
struct param *param;
struct result *result;
param = (struct param *)arg; // 参数都是void *,要转成对应的类型
for (int i=param->start; i<param->end; i++) {
for (int j=0; j<param->end-i-1; j++) {
if (array[param->start+j] > array[param->start+j+1]) {
int temp;
temp = array[param->start+j];
array[param->start+j] = array[param->start+j+1];
array[param->start+j+1] = temp;
}
}
}
result = malloc(sizeof(struct result));
for (int i=0; i<5; i++) {
result->sum[i] = array[param->start+i];
}
return result;
}
int main() {
pthread_t son[CPU_NUM];
struct param params[CPU_NUM]; // 必须要申请,否则段错误
for (int i=0; i<CPU_NUM; i++) {
// param不可作为临时变量,都必须是params的地址
struct param *param;
param = ¶ms[i];
param->start = i*CHILD;
param->end = (i+1)*CHILD;
pthread_create(&son[i], NULL, select_sort, param);
}
double sum = 0;
int son1[CHILD]; // son1存储子线程1结果
int son2[CHILD]; // son2存储子线程2结果
int ending[10];
for (int i=0; i<CPU_NUM; i++) {
struct result *result;
pthread_join(son[i], (void **)&result);
if (i == 0) {
for (int j=0; j<CHILD; j++) {
son1[j] = result->sum[j];
}
}
else {
for (int j=0; j<CHILD; j++) {
son2[j] = result->sum[j];
}
}
free(result); // 用完一定要释放
}
// 主进程归并排序
int p,q;
int index = 0;
for (p=0,q=0; p<CHILD&&q<CHILD;) {
if (son1[p] < son2[q]) {
ending[index++] = son1[p++];
}
else {
ending[index++] = son2[q++];
}
}
if (p == CHILD) {
for (;q<CHILD;q++) {
ending[index++] = son2[q];
}
}
else if (q == CHILD) {
for (;p<CHILD;p++) {
ending[index++] = son1[p];
}
}
for (int i=0; i<10; i++) {
printf("%d ", ending[i]);
}
return 0;
}
对于这个代码有几个地方值得商榷:
1.题中要求是选择排序,但我用了冒泡排序。但不影响训练目标
2.这里使用了son1,son2存储排序结果,显得有些多余,不知道这样可不可以?是否能在线程的逻辑语句中就把数据处理好。
3.这里面对于待排序的数组设置为静态数组,但扩展性不够好。应当动态统计排序个数。
因作者水平有限,如果错误之处,请在下方评论区指正,谢谢!