编写一个多线程函数实现对数组排序,要求: 1.至少用两个线程 2.数组的元素值可以事先定义好,或者可以从键盘输入(增加一个线程)。 3.用一个线程对数组排序,用另一个线程输出排序结果。 4.保证先排好序,再输出。

#include"stdio.h"
#include"pthread.h"
#include"semaphore.h"

static int datbuf[10] = {0};
static int n;
sem_t sem1,sem2,sem3;

void *do_input(void *pvoid)
{
    int i;

    sem_wait(&sem1);

    printf("please input data\n");
    for(i = 0;;i++)
    {
      scanf("%d",&datbuf[i]);
      n++;
      if(getchar()==‘\n‘)
         break;
    }
    sem_post(&sem2);
    pthread_exit(NULL);

}
void *do_swap(void *pvoid)
{
  int i,j,min;

  sem_wait(&sem2);
  printf("data:\n");
  for(i = 0; i<n;i++)
  {
    printf(" %d",datbuf[i]);
  }
  printf("\nswap:\n");
  for(i = 0;i < n;i++)
  {
    for(j = 0;j<n-i-1;j++)
      if(datbuf[j]>datbuf[j+1])
       {
         min = datbuf[j];
         datbuf[j] = datbuf[j+1];
         datbuf[j+1] = min;
       }
  }
  sem_post(&sem3);
  pthread_exit(NULL);
}

void *do_show(void *pvoid)
{
  int i;

  sem_wait(&sem3);
  for(i = 0; i<n;i++)
  {
    printf(" %d",datbuf[i]);
  }
  sem_post(&sem1);
  pthread_exit(NULL);
}

int main()
{
  pthread_t tid1,tid2,tid3;
  int ret;

  ret = sem_init(&sem1,0,1);
  ret += sem_init(&sem2,0,0);
  ret += sem_init(&sem3,0,0);
  if(ret != 0)
  {
     printf("Any semaphore inittialization failed\n");
     return ret;
  }

  pthread_create(&tid1,NULL,&do_input,NULL);
  pthread_create(&tid2,NULL,&do_show,NULL);
  pthread_create(&tid3,NULL,&do_swap,NULL);

  pthread_join(tid1,NULL);
  pthread_join(tid2,NULL);
  pthread_join(tid3,NULL);
  return 0;
}
时间: 2024-08-01 18:46:54

编写一个多线程函数实现对数组排序,要求: 1.至少用两个线程 2.数组的元素值可以事先定义好,或者可以从键盘输入(增加一个线程)。 3.用一个线程对数组排序,用另一个线程输出排序结果。 4.保证先排好序,再输出。的相关文章

编程题:指针变量,实参与形参的引用。已知一个一维数组,求其中前n个数的和。n由键盘输入。

#include<stdio.h> int sum(int *q,int n) { int i,s=0; for(i=0;i<n;i++,q++) s+=*q; return s; } void main() { int num,a[10]={1,2,3,4,5,6,7,8,9,10}; int *p=a; scanf("%d",&num); printf("%d\n",sum(p,num)); } 编程题:指针变量,实参与形参的引用.已知

编程题:已知一个一维数组,求其中前n个数的和。n由键盘输入

#include<stdio.h> int sum(int array[],int n) { int i,s=0; for(i=0;i<n;i++) s+=array[i]; return s; } void main() { int num,a[10]={1,2,3,4,5,6,7,8,9,10}; scanf("%d",&num); printf("%d\n",sum(a,num)); } 编程题:已知一个一维数组,求其中前n个数的和.

C++_第七章函数的基本知识_求阶乘的子函数_ 函数参数类型为数组_ 求数组内所有元素和、部分元素和的方法_实现了先从键盘输入到一个数组中,再用for循环取读出数组中的元素 for循环也可以用break来结束循环的

/* 第七章函数的基本知识 */ /*01)c++对于返回值有一定的限制:可以是常量.变量.指针.结构对象或表达式,但不可以是数组02)c++返回数组的方法:将数组作为结构会对象组成部分来返回03)函数遇到return则结束该函数04)如果一个函数的两房额参数类型相同,则必须分别制定每个参数的类型,而不能像声明常规变量那样,将声明组合在一起05)*/ //本代码注意double类型的写法以及double和int类型数据的转换 1 #include <iostream> 2 3 void che

已知一个6*6的矩阵(方阵),把矩阵二条对角线上的元素值加上10,然后输出这个新矩阵

#include<iostream>using namespace std;const int n=6;int a[7][7];int main(){ for(int i=1;i<=6;++i) for(int j=1;j<=6;++j) cin>>a[i][j]; for(int i=1;i<=6;++i) for(int j=1;j<=6;++j) if((i==j)||(i+j==7)) a[i][j]+=10; for(int i=1;i<=6

利用map和reduce编写一个str2float函数,把字符串&#39;123.456&#39;转换成浮点数123.456:

from functools import reduce CHAR_TO_FLOAT = { '0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9, '.': -1 } def str2float(s): nums=map(lambda x:CHAR_TO_FLOAT[x],s) #print(list(nums)) point = 0 def str_division(f,n): nonlo

编写一个模版函数count

返回值是数组的a[0:n-1]的数组个数. 知识点:数组的两个特殊性质对我们定义和使用作用在数组上的函数有影响,这两个性质分别是:不允许拷贝数组以及使用数组时(通常)会将其转换成指针.因为不能拷贝数组,所以我们无法以值传递的方式使用数组参数.因为数组会被转换成指针,所以当我们为函数传递一个数组时,实际上传递的饰指向数组首元素的指针. ex: void print(const int*); void print(const int[]); void print(const int[10]) 答案:

使用函数指针,完成一个sort()函数,能对任何类型的数组元素进行排序: 回调函数 以及 memcpy ()原型实现

进来复习了一下C语言指针,一直没有写过太多关于函数指针的代码,而且对回调函数的理解一直都是在理论上,基本上没有太写过关于它的代码,进来得空,写了一个小程序加深下自己对回调函数和函数指针的理解. 问题描述: 编写一个sort()函数,使它能够对任何类型的数组元素进行排序. 下面是我写的代码: /* 使用函数指针的回调函数技巧,设计一个能排序int 和char 数组的sort()函数 */ #include<stdio.h> #include<stdlib.h> #include<

一个Sqrt函数引发的血案

我们平时经常会有一些数据运算的操作,需要调用sqrt,exp,abs等函数,那么时候你有没有想过:这个些函数系统是如何实现的?就拿最常用的sqrt函数来说吧,系统怎么来实现这个经常调用的函数呢? 虽然有可能你平时没有想过这个问题,不过正所谓是"临阵磨枪,不快也光",你"眉头一皱,计上心来",这个不是太简单了嘛,用二分的方法,在一个区间中,每次拿中间数的平方来试验,如果大了,就再试左区间的中间数:如果小了,就再拿右区间的中间数来试.比如求sqrt(16)的结果,你先试

写一个JavaScript函数,把url解析成对象

请编写一个JavaScript函数parseUrl.目的是把URL参数解析为一个对象,如: var url='http://192.168.1.1/index.php?p0=0&p1=1&p2=2'; var obj=parseUrl(url);console.log(obj.p0,obj.p1,obj.p2);//输出0,1,2 1 <script> 2 var url='http://192.168.1.1/index.php?p0=0&p1=1&p2=2'