`
deepfuture
  • 浏览: 4425777 次
  • 性别: Icon_minigender_1
  • 来自: 湛江
博客专栏
073ec2a9-85b7-3ebf-a3bb-c6361e6c6f64
SQLite源码剖析
浏览量:80284
1591c4b8-62f1-3d3e-9551-25c77465da96
WIN32汇编语言学习应用...
浏览量:70705
F5390db6-59dd-338f-ba18-4e93943ff06a
神奇的perl
浏览量:103896
Dac44363-8a80-3836-99aa-f7b7780fa6e2
lucene等搜索引擎解析...
浏览量:287183
Ec49a563-4109-3c69-9c83-8f6d068ba113
深入lucene3.5源码...
浏览量:15109
9b99bfc2-19c2-3346-9100-7f8879c731ce
VB.NET并行与分布式编...
浏览量:68203
B1db2af3-06b3-35bb-ac08-59ff2d1324b4
silverlight 5...
浏览量:32461
4a56b548-ab3d-35af-a984-e0781d142c23
算法下午茶系列
浏览量:46217
社区版块
存档分类
最新评论

linux-C多线程读写互斥

阅读更多

 

计算1+1/2+1/3+......和1+1/2-1/3+1/4-1/5......

其中1/n由n个线程计算并使用写互斥写入中间数组,2个线程用读互斥从中间数组中读取结果分别进行1+1/2+1/3+......和1+1/2-1/3+1/4-1/5......的计算。

deepfuture@deepfuture-laptop:~/private/mytest$ gcc -lpthread -std=gnu99 -o test2 test2.c

test2.c: In function ‘myprint1’:

test2.c:32: warning: implicit declaration of function ‘sleep’

deepfuture@deepfuture-laptop:~/private/mytest$ ./test2

please input an integer:(<=1000)2

1/1 finished,push 1.0000000000

*******1/1:1.0000000000 computed result 1.0000000000

1/1:1.0000000000 added result 1.0000000000

1/2 finished,push 0.5000000000

1/2:0.5000000000 added result 1.5000000000

================add finish!============ result:1.5000000000

*******1/2:0.5000000000 computed result 0.5000000000

================compute finish!============ result:0.5000000000

deepfuture@deepfuture-laptop:~/private/mytest$ ./test2

please input an integer:(<=1000)3

1/1 finished,push 1.0000000000

1/1:1.0000000000 added result 1.0000000000

*******1/1:1.0000000000 computed result 1.0000000000

1/2 finished,push 0.5000000000

1/2:0.5000000000 added result 1.5000000000

*******1/2:0.5000000000 computed result 0.5000000000

1/3 finished,push 0.3333333333

*******1/3:0.3333333333 computed result 0.8333333333

================compute finish!============ result:0.8333333333

1/3:0.3333333333 added result 1.8333333333

================add finish!============ result:1.8333333333

deepfuture@deepfuture-laptop:~/private/mytest$ ./test2

please input an integer:(<=1000)4

1/1 finished,push 1.0000000000

1/1:1.0000000000 added result 1.0000000000

*******1/1:1.0000000000 computed result 1.0000000000

*******1/2:0.5000000000 computed result 0.5000000000

1/2 finished,push 0.5000000000

1/2:0.5000000000 added result 1.5000000000

1/3 finished,push 0.3333333333

*******1/3:0.3333333333 computed result 0.8333333333

1/3:0.3333333333 added result 1.8333333333

1/4 finished,push 0.2500000000

1/4:0.2500000000 added result 2.0833333333

================add finish!============ result:2.0833333333

*******1/4:0.2500000000 computed result 0.5833333333

================compute finish!============ result:0.5833333333

deepfuture@deepfuture-laptop:~/private/mytest$ 

#include <pthread.h>
#include <bits/pthreadtypes.h>
#include <stdio.h>
#include <stdlib.h>
#define MAXS 1000 



double myjg[MAXS+1];//计算结果存放位置
int max;
pthread_rwlock_t myrwlock; 
pthread_rwlockattr_t myrwlockattr; 
pthread_t threads[MAXS+2]; 
 

void *mycomp(void *x){//计算1/i的结果,计算结果放在一个数组中。
int i;
pthread_rwlock_wrlock(&myrwlock); //互斥写锁,没有线程拥有互斥读锁时,可以加互斥写锁,临界区,完成对i的累加,保证不被多个线程同时修改i
myjg[0]++;
i=myjg[0];//myjg[0]存放着线程已经计算到的i。
pthread_rwlock_unlock(&myrwlock); 
myjg[i]=(1/(double)i);
printf("1/%d finished,push %.10f\n",i,myjg[i]); 
}

void *myprint1(void *xx){//读取数组,将计算结果累加,最终完成1/1+1/2+1/3+......+1/n的计算
int maxi;
int curi=1;
double jg=0;
  while(curi<=max)
  {
	  sleep(1);
	  pthread_rwlock_rdlock(&myrwlock); //互斥读锁,在互斥写解锁后可以有多个互斥读锁同时存在,临界区,取出正确的i,保证此时没有线程写i
	  maxi=myjg[0];
      pthread_rwlock_unlock(&myrwlock);
      
            for (;curi<=maxi;curi++){
  		        jg+=myjg[curi];
                printf("1/%d:%.10f added result %.10f\n",curi,myjg[curi],jg);   		        
  		    } 
  }
    	   printf("================add finish!============ result:%.10f\n",jg);//输出累加结果。
}

void *myprint2(void *xx){//读取数组,将计算结果完成1/1+1/2-1/3+1/4-1/5......的计算
int maxi;
int curi=1;
int fh=1;
double jg=0;
  while(curi<=max)
  {
	  sleep(1);
	  pthread_rwlock_rdlock(&myrwlock); //互斥读锁,在互斥写解锁后可以有多个互斥读锁同时存在,临界区,取出正确的i,保证此时没有线程写i
	  maxi=myjg[0];
      pthread_rwlock_unlock(&myrwlock);
 
            for (;curi<=maxi;curi++){                
  		        jg+=fh*myjg[curi];
                printf("*******1/%d:%.10f computed result %.10f\n",curi,myjg[curi],jg);  
                fh=-fh;   		        
  		    }	  
  }
  		 printf("================compute finish!============ result:%.10f\n",jg);//输出累加结果  
  pthread_rwlock_destroy(&myrwlock);  
  pthread_rwlockattr_destroy(&myrwlockattr);    
}

int main(){
//计算1+1/2+1/3+......和1+1/2-1/3+1/4-1/5......
 

  pthread_rwlockattr_init(&myrwlockattr);
  pthread_rwlockattr_setpshared(&myrwlockattr,PTHREAD_PROCESS_PRIVATE);//设置互斥为同一进程共享,也可设置为多个进程共享
  pthread_rwlock_init(&myrwlock,&myrwlockattr);  

  printf("please input an integer:(<=%d)",MAXS);
  while (scanf("%d",&max),max>MAXS){//n的最大值
      printf("please input an integer:(<=%d)",MAXS);
  };
  //深未来技术http://deepfuture.iteye.com/
  myjg[0]=0;
  pthread_create(&(threads[0]),NULL,myprint1,NULL);    
  pthread_create(&(threads[1]),NULL,myprint2,NULL);   
  for (int i=2;i<=max+1;i++){
    pthread_create(&(threads[i]),NULL,mycomp,NULL);
      	  sleep(1);
 
  } 
	  sleep(1);
  //for (int i=0;i<=max+1;i++){
  //  pthread_join(threads[i],NULL);  	
 // }  

  return(0);
} 
     
 
1
0
分享到:
评论

相关推荐

    linux下C语言多线程编程实例

    在Linux环境下进行C语言多线程编程,可以利用POSIX线程库,也称为pthread库。这个库提供了创建、同步和管理线程的一系列接口,使得开发者能够在单个进程中同时执行多个任务,从而提高程序的并行性。下面将详细探讨多...

    linux上实现多进程和多线程实现同步互斥(源代码)

    在Linux操作系统中,多进程和多线程是两种并发执行的方式,它们在处理并发问题时,经常需要进行同步和互斥操作,以确保数据的一致性和程序的正确性。本篇将详细介绍这两种并发模型以及如何在Linux环境中实现同步互斥...

    Linux下多线程及多进程及同步与互斥编程详细介绍

    Linux下多线程及多进程及同步与互斥编程详细介绍

    Linux操作系统编程(linux多线程的互斥与同步控制及实践)

    总的来说,Linux多线程编程涉及的概念和实践技巧非常广泛,包含了线程的创建与管理、互斥锁、读写锁、条件变量、死锁预防、线程间通信、信号量等重要知识点。在设计和实现多线程程序时,需要合理地选择和使用这些...

    Linux-C语言编程系列

    总的来说,Linux下的C语言编程涵盖了操作系统原理、系统调用、文件I/O、进程和线程管理、网络编程、内存管理等多个方面。通过不断实践和学习,开发者可以利用C语言的威力,充分挖掘Linux系统的潜力,创建高效、稳定...

    linux下多线程读写socket的简单例子

    在Linux操作系统中,多线程编程与网络通信的结合是一个重要的技术领域,特别是在服务器开发中。...对于初学者来说,这是一个很好的起点,通过动手实践,逐步掌握Linux多线程Socket编程的核心技巧。

    Linux编程手册-多线程-详细资料.rar

    《Linux多线程编程.docx》和《Linux多线程编程.pdf》这两份文档可能提供了具体的示例代码和案例分析,通过实际操作帮助读者巩固理论知识,提升实战能力。学习多线程编程不仅需要理解概念,更要通过实践来锻炼解决...

    linux-c-api-ref.zip_linux api_linux-c-api-ref

    在Linux操作系统中,C语言API(Application Programming Interface)是开发者与操作系统进行交互的主要方式。Linux-C-API-ref资源提供了一个详细的学习指南,涵盖了Linux系统调用和C库函数的使用,对于想要深入理解...

    Linux c++多线程串口编程demo

    本示例"Linux c++多线程串口编程demo"聚焦于利用多线程技术实现串口通信,这是一种常见的硬件接口,用于设备之间的数据交换。下面我们将深入探讨这个demo涉及的知识点。 1. **多线程编程**:在C++中,我们可以使用`...

    Windows和Linux下多线程编程

    在操作系统如Windows和Linux中,多线程被广泛用于实现并发处理,使得应用程序能够同时处理不同的任务。下面将详细讨论Windows和Linux下多线程编程的关键知识点。 1. **线程的概念**: - 线程是操作系统分配CPU时间...

    Linux下C语言多线程,网络通信简单聊天程序

    本文将介绍如何在Linux环境下使用C语言实现一个多线程的简单聊天程序,该程序基于网络通信,能够实现1对N的聊天模式。主要涉及的技术包括多线程、网络编程、UNIX域协议(文件系统套接字)以及异步I/O模型的select...

    Linux系统下的多线程编程入门.pdf

    在Linux系统下进行多线程编程是开发高效并发应用程序的关键技术之一。本文将深入探讨Linux环境中的多线程概念、创建与管理线程的方法、线程同步与通信机制,以及多线程编程中可能遇到的问题和解决策略。 一、多线程...

    嵌入式Linux应用程序开发详解-第9章(多线程编程)

    ### 嵌入式Linux应用程序开发详解:多线程编程 #### 1. Linux线程概述 在嵌入式Linux应用程序开发中,...通过深入学习和实践,开发者可以充分利用Linux多线程编程的强大功能,构建高性能、高可靠性的嵌入式应用系统。

    linux系统下多线程编程.PDF

    Linux系统下的多线程编程是指在Linux操作系统中,使用C语言等编程工具和多线程技术来编写能够同时执行多个任务的程序。多线程编程相较于传统的单线程编程,可以让程序更加高效地使用计算机的CPU资源,提高程序的响应...

    多线程编程和操作系统线程同步互斥演示

    多线程编程广泛应用于现代操作系统,如Windows、Linux和Unix,以及各种编程语言,包括C++、Java、Python等。VC(Visual C++)是微软提供的一个集成开发环境,支持创建多线程应用程序。 在多线程环境中,线程同步和...

    Linux多线程编程手册,linux多线程编程手册pdf,C,C++

    总之,Linux多线程编程手册深入浅出地介绍了在Linux系统中使用C++和C进行多线程网络编程的相关知识,从基础到高级,涵盖了线程创建、同步、通信、网络编程等多个方面,是学习和实践Linux多线程编程的重要参考资料。

    linux多线程编程.pdf

    Linux多线程编程是现代操作系统编程的重要组成部分,尤其是在Linux环境下,多线程编程更是成为了高性能应用不可或缺的技术之一。本文档主要涉及Linux多线程编程的一些关键知识点,包括pthread线程库的使用、线程的...

    linux 多线程本科毕业设计

    使用 C 语言可以实现高效的多线程程序,并且可以与 Linux 操作系统紧密集成。 使用互斥锁进行数据交互 在多线程程序中,数据交互是一个非常重要的议题。为了保证数据的一致性和安全性,需要使用互斥锁机制。互斥锁...

    linux-c编程linux-c编程

    ### Linux-C编程重要知识点概述 #### 一、基础知识 ##### 源程序编译 - **GCC编译器**: 在Linux环境下,最常用的C语言编译器是GNU Compiler Collection (GCC)。它不仅支持C语言,还支持C++、Objective-C、Fortran...

    15-linux线程专题讲座-王保明.rar

    在Linux操作系统中,线程是进程的一个执行单元,它共享同一进程的地址空间和其他资源,因此线程间的通信...通过本次讲座,我们可以全面了解Linux线程的原理与实践,提升在多线程编程中的技能,更好地应对复杂并发场景。

Global site tag (gtag.js) - Google Analytics