计算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);
}
分享到:
相关推荐
在Linux环境下进行C语言多线程编程,可以利用POSIX线程库,也称为pthread库。这个库提供了创建、同步和管理线程的一系列接口,使得开发者能够在单个进程中同时执行多个任务,从而提高程序的并行性。下面将详细探讨多...
在Linux操作系统中,多进程和多线程是两种并发执行的方式,它们在处理并发问题时,经常需要进行同步和互斥操作,以确保数据的一致性和程序的正确性。本篇将详细介绍这两种并发模型以及如何在Linux环境中实现同步互斥...
Linux下多线程及多进程及同步与互斥编程详细介绍
总的来说,Linux多线程编程涉及的概念和实践技巧非常广泛,包含了线程的创建与管理、互斥锁、读写锁、条件变量、死锁预防、线程间通信、信号量等重要知识点。在设计和实现多线程程序时,需要合理地选择和使用这些...
总的来说,Linux下的C语言编程涵盖了操作系统原理、系统调用、文件I/O、进程和线程管理、网络编程、内存管理等多个方面。通过不断实践和学习,开发者可以利用C语言的威力,充分挖掘Linux系统的潜力,创建高效、稳定...
在Linux操作系统中,多线程编程与网络通信的结合是一个重要的技术领域,特别是在服务器开发中。...对于初学者来说,这是一个很好的起点,通过动手实践,逐步掌握Linux多线程Socket编程的核心技巧。
《Linux多线程编程.docx》和《Linux多线程编程.pdf》这两份文档可能提供了具体的示例代码和案例分析,通过实际操作帮助读者巩固理论知识,提升实战能力。学习多线程编程不仅需要理解概念,更要通过实践来锻炼解决...
在Linux操作系统中,C语言API(Application Programming Interface)是开发者与操作系统进行交互的主要方式。Linux-C-API-ref资源提供了一个详细的学习指南,涵盖了Linux系统调用和C库函数的使用,对于想要深入理解...
本示例"Linux c++多线程串口编程demo"聚焦于利用多线程技术实现串口通信,这是一种常见的硬件接口,用于设备之间的数据交换。下面我们将深入探讨这个demo涉及的知识点。 1. **多线程编程**:在C++中,我们可以使用`...
在操作系统如Windows和Linux中,多线程被广泛用于实现并发处理,使得应用程序能够同时处理不同的任务。下面将详细讨论Windows和Linux下多线程编程的关键知识点。 1. **线程的概念**: - 线程是操作系统分配CPU时间...
本文将介绍如何在Linux环境下使用C语言实现一个多线程的简单聊天程序,该程序基于网络通信,能够实现1对N的聊天模式。主要涉及的技术包括多线程、网络编程、UNIX域协议(文件系统套接字)以及异步I/O模型的select...
在Linux系统下进行多线程编程是开发高效并发应用程序的关键技术之一。本文将深入探讨Linux环境中的多线程概念、创建与管理线程的方法、线程同步与通信机制,以及多线程编程中可能遇到的问题和解决策略。 一、多线程...
### 嵌入式Linux应用程序开发详解:多线程编程 #### 1. Linux线程概述 在嵌入式Linux应用程序开发中,...通过深入学习和实践,开发者可以充分利用Linux多线程编程的强大功能,构建高性能、高可靠性的嵌入式应用系统。
Linux系统下的多线程编程是指在Linux操作系统中,使用C语言等编程工具和多线程技术来编写能够同时执行多个任务的程序。多线程编程相较于传统的单线程编程,可以让程序更加高效地使用计算机的CPU资源,提高程序的响应...
多线程编程广泛应用于现代操作系统,如Windows、Linux和Unix,以及各种编程语言,包括C++、Java、Python等。VC(Visual C++)是微软提供的一个集成开发环境,支持创建多线程应用程序。 在多线程环境中,线程同步和...
总之,Linux多线程编程手册深入浅出地介绍了在Linux系统中使用C++和C进行多线程网络编程的相关知识,从基础到高级,涵盖了线程创建、同步、通信、网络编程等多个方面,是学习和实践Linux多线程编程的重要参考资料。
Linux多线程编程是现代操作系统编程的重要组成部分,尤其是在Linux环境下,多线程编程更是成为了高性能应用不可或缺的技术之一。本文档主要涉及Linux多线程编程的一些关键知识点,包括pthread线程库的使用、线程的...
使用 C 语言可以实现高效的多线程程序,并且可以与 Linux 操作系统紧密集成。 使用互斥锁进行数据交互 在多线程程序中,数据交互是一个非常重要的议题。为了保证数据的一致性和安全性,需要使用互斥锁机制。互斥锁...
### Linux-C编程重要知识点概述 #### 一、基础知识 ##### 源程序编译 - **GCC编译器**: 在Linux环境下,最常用的C语言编译器是GNU Compiler Collection (GCC)。它不仅支持C语言,还支持C++、Objective-C、Fortran...
在Linux操作系统中,线程是进程的一个执行单元,它共享同一进程的地址空间和其他资源,因此线程间的通信...通过本次讲座,我们可以全面了解Linux线程的原理与实践,提升在多线程编程中的技能,更好地应对复杂并发场景。