#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<pthread.h>

int arr[]={67,45,7,348,60,4,87,2,3,5};
int g_i=0;
pthread_t thread[2];
pthread_mutex_t mutex_1,mutex_2;//互斥锁

void print_arry()//打印数组
{
        int i=0;
        for(;i<10;i++)
        {
                printf("%d\t",arr[i]);
        }
        printf("\n");
}
void swap_elem(int *a,int *b)//交换地址中的值
{
        int temp;
        temp=*a;
        *a=*b;
        *b=temp;
}
void *entrance_1(void *arg)//线程1的处理函数
{
        printf("1\n");
        int j=0;
        for(;g_i<10;g_i++)
        {
                pthread_mutex_lock(&mutex_2);
                //      printf("1g_i=%d\n",g_i);
                printf("线程1执行后台排序.\n");
                for(j=0;j<10-g_i-1;j++)

{
                        if(arr[j]>arr[j+1])
                        {
                                swap_elem(&arr[j],&arr[j+1]);
                        }
                }
                pthread_mutex_unlock(&mutex_1);
        }

return ((void *)1);
}
void *entrance_2(void *arg)//线程2的处理函数
{
        printf("2\n");
        int j=0;
        for(;g_i<10;g_i++)
        {
                pthread_mutex_lock(&mutex_1);

// printf("2g_i=%d\n",g_i);
  printf("线程2执行后台排序.\n");
  for(j=0;j<10-g_i-1;j++)
  {
   if(arr[j]>arr[j+1])
   {
    swap_elem(&arr[j],&arr[j+1]);
   }
  }
  pthread_mutex_unlock(&mutex_2);
 }
 return ((void *)2);       
}

void create_two_thread()//创建2个线程
{

memset(thread,0,sizeof(thread));
 if((pthread_create(&thread[0],NULL,entrance_1,NULL))==0)
 {
  printf("创建线程1成功\n");
 }else{

printf("创建线程1失败\n");
  exit(EXIT_FAILURE);
 }
 if((pthread_create(&thread[1],NULL,entrance_2,NULL))==0)
 {
  printf("创建线程2成功\n");
 }else{

printf("创建线程2失败\n");
  exit(EXIT_FAILURE);
 }

}
void do_and_wait()//2线程执行与等待
{
 void *ret[2];
 if(thread[0]!=0)
 {
  pthread_join(thread[0],&ret[0]);
  printf("\n线程1执行结束退出\n");
 }else{
  printf("线程1创建失败\n");
  exit(EXIT_FAILURE);
 }

if(thread[1]!=0)
 {

pthread_join(thread[1],&ret[1]);
  printf("\n线程2执行结束退出\n");

}else{
  printf("线程2创建失败\n");
  exit(EXIT_FAILURE);
 }
 printf("线程1的返回值为:%d\n",(int) ret[0]);
 printf("线程2的返回值为:%d\n",(int) ret[1]);
 pthread_mutex_destroy(&mutex_1);
 pthread_mutex_destroy(&mutex_2);
}

int main()
{
 printf("主函数,创建2个线程,共同实现冒泡排序\n");
 pthread_mutex_init(&mutex_1,NULL);
 pthread_mutex_init(&mutex_2,NULL);
 print_arry();
 create_two_thread();
 do_and_wait();
 printf("排序完成.\n");
 print_arry();
 return 0;
}
运行结果为:

2个线程共同处理冒泡排序 Linux 双线程处理相关推荐

  1. Linux 线程并发拷贝,【Linux】线程并发拷贝程序

    据说大连某211高校的李教授越来越重口,不仅延续要求他所带的每一个本科班,都要写一份线程并发拷贝程序的传统,而且还开始规定不能用Java语言写作,导致我之前写的<[Java]线程并发拷贝程序&g ...

  2. linux 线程与进程 pid,linux下线程所属进程号问题

    这一段看<unix环境高级编程>,一个关于线程的小例子. #include #include #include pthread_t ntid; void printids(const ch ...

  3. linux进程线程视频百度云,linux 进程线程时间片

    aero 回复于:2003-08-10 21:01:44 偶觉得,已经不菜了. 如果你菜,那偶就还是鸟蛋了. coolhome 回复于:2003-08-10 20:27:00 [code:1:334e ...

  4. linux线程切换回调函数,linux C线程退出回调函数

    待补充.................... 函数原型 void pthread_cleanup_push(void (*routine)(void*), void *arg); void pthr ...

  5. linux malloc 线程,Linux上的侧线程的malloc/calloc崩溃

    我正在用C写一个服务器 - 客户端应用程序,共享一些信息.服务器以双线程模式工作 - 主线程等待输入,而侧线程响应客户端的请求.客户端也是这样工作的,但它等待用户输入(来自stdin),并且如果它接收 ...

  6. linux取消线程的原理,浅析 Linux 进程与线程

    简介 进程与线程是所有的程序员都熟知的概念,简单来说进程是一个执行中的程序,而线程是进程中的一条执行路径.进程是操作系统中基本的抽象概念,本文介绍 Linux 中进程和线程的用法以及原理,包括创建.消 ...

  7. linux杀死线程函数,Linux线程-pthread_kill

    该函数可以用于向指定的线程发送信号: int pthread_kill(pthread_t threadId,int signal); 如果线程内不对信号进行处理,则调用默认的处理程式,如SIGQUI ...

  8. 初识Linux C线程

    线程与进程 进程是操作系统资源分配的基本单位,而线程是任务调度和执行的基本单位,线程在某种程度上可以看做轻量级的进程. 每个进程都有独立的代码和数据空间,程序间的切换会有较大开销:同一组线程可以共享代 ...

  9. Linux 双网卡绑定测试

    Linux 双网卡绑定测试 先介绍一下情况,服务器A和服务器B都是CentOS 4.6的系统,现在要做HA Cluster,为了避免裂脑的发生,要提高心跳链路的可靠性,下图是现时的连接情况,服务器A的 ...

最新文章

  1. 现实世界的Windows Azure:采访圣地亚哥公共安全小组的技术经理Adrian Gonzalez
  2. cmd不是内部命令解决方法
  3. ftp服务器账户密码修改,ftp服务器如何设置账户密码
  4. centeros /redhate密码破解
  5. 12-思科防火墙:ASA会话超时
  6. 烽火服务器怎么进入bios系统,装机高手告诉你如何进入bios
  7. oracle删除已创建的用户,ORACLE用户创建删除
  8. CSS:实现文本超出显示省略效果(可指定几行显示)
  9. python df共有几行_从zero到hero,一款Python自然语言处理效率利器!
  10. CSDN 总部落户长沙,共建中国开发者产业中心城市!
  11. web 前端 html
  12. Spring 通过XML配置装配Bean
  13. 3D数学 学习笔记(4) 几何图元
  14. 一套完整的网络视频监控系统设计方案
  15. android睡眠伴侣,GitHub - HuangZengPei/Sleepmon: 我的Android团队项目,一款可以监测、统计睡眠质量情况的睡眠健康伴侣应用。...
  16. SpringBoot整合Tomcat中的组件
  17. 分享30个优秀的网站导航设计案例
  18. 系统集成项目管理工程师学习
  19. 交通·未来系列学术活动第1期:时空交通数据预测方法及应用
  20. cgb2007-京淘day16

热门文章

  1. Like Sunday, Like Rain - JavaScript运算符优先级
  2. 使用Hystrix实现自动降级与依赖隔离-微服务
  3. 树形控件显示数据库数据项
  4. Win10右键添加获取管理员权限
  5. 类火墙的iptables
  6. 【转】java获取当前路径的几种方法
  7. 如何拉起被一键清除的安卓进程
  8. centos6.0的gnome桌面的一个大bug
  9. ORACLE 10G RAC 10.2.0.5 删除节点
  10. android 开发热更新技术Andfix 和 Tinker