操作系统实践(八)

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

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

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值