操作系统实践(八)

  本次实验课程内容没有更新,留了一个作业,还是对于线程的训练,内容如下:
在这里插入图片描述
  按照上节课的内容,对代码进行下修改,如下:

#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 = &params[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.这里面对于待排序的数组设置为静态数组,但扩展性不够好。应当动态统计排序个数。

因作者水平有限,如果错误之处,请在下方评论区指正,谢谢!

Guess you like

Origin blog.csdn.net/gls_nuaa/article/details/117639595